Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
Abbattar
1 / 1 / 0
Регистрация: 06.04.2011
Сообщений: 21
#1

Неверное отображение перевёнутой строки - C++

26.06.2011, 03:26. Просмотров 1370. Ответов 21
Метки нет (Все метки)

Код переписан из учебника "Шаг за шагом. С++" Г.Шилдта

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/*
 Проект 4-2 "Переворачивание строки".
*/
 
#include <iostream>
#include <cstring>
using namespace std;
 
int main(){
    
    char str[] = "Это проверка работы программы", *firstEl, *lastEl, tVar;
    int lenVar;
    
    cout << "\nИсходная строка: " << str << "\n\n";
    
    lenVar = strlen(str);
    
    firstEl = str;
    lastEl = &str[lenVar - 1];
    
    while(firstEl < lastEl){
        
        /* произведём обмен символами */
        
        tVar = *firstEl;
        *firstEl = *lastEl;
        *lastEl = tVar;
        
        /* Продвинем указатели */
        
        firstEl++;  lastEl--;
    }
    
    cout << "Перевёрнутая строка: " << str << "\n\n";
    
    return 0;
}
вывод программы, такой:

Исходная строка: Это проверка работы программы

Перевёрнутая строка: �ѼмаЀѳоЀѿ� �тѾбаЀ� �кЀѵвоЀѿ� �Ђѭ�
в чём ошибка может быть, ведь строка переворачивается с изменением?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.06.2011, 03:26     Неверное отображение перевёнутой строки
Посмотрите здесь:

Неверное отображение кириллических символов в консоли - C++
Добавление языка в программе есть, а он каракули выводит! Что я делаю не так? #include&lt;iostream&gt; #include &lt;fstream&gt; #include ...

Неверное определение длины строки - C++
Всем привет. почему так происходит? пишу так char* nama = new char; cout &lt;&lt; &quot;strlen = &quot; &lt;&lt; strlen(nama) &lt;&lt; endl; выводит...

Строки: почему выводится неверное количество символов? - C++
Почему выводит количество символов 507, хотя массив равен 500 символов #include &lt;iostream&gt; int main() { using namespace std; ...

Выделение первого слова из введенной строки и отображение его на экране - C++
1) Написать программу выделения первого слова из введенной строки *) и отображение его на экране.

Неверное значение - C++
Имеется такой кусок кода: if (second_menu == 0) main_menu(); // главное меню else { weight_menu(); // меню...

неверное выполнение multimap - C++
В задачу программы входит заполнения контейнера multimap и вывод содержимого построчно(все на стандартных потоках). Програмка работает но...

Неверное преобразование типов - C++
int i = 1 ; unsigned char ii ; ii = static_cast&lt;unsigned char&gt; i ; как правильно преобразовать?

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
xAtom
914 / 739 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
26.06.2011, 04:23     Неверное отображение перевёнутой строки #2
Вот попробуй.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
using namespace std;
 
void main(void) {
 
      char    str[]  = "DooM, Quake-3";
      char*  first   = str;
      char*  last    = str +  strlen(str) - 1;
      char   ch;
 
      while( first != last ) {
          ch    = *first;
          *first = *last;
          *last = ch;
         ++first;
           --last;
     }
     cout << str << endl;
 
     // проверка как строка-реверсинулась
     char  test[] = "DooM, Quake-3";
     strrev(test);
     cout << test << endl;
 
 
  cin.get();
}
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
26.06.2011, 04:27     Неверное отображение перевёнутой строки #3
Abbattar, добавьте
C++
1
2
3
4
5
int main()
{
    std::locale::global(std::locale("")); 
    char str[] = "Это проверка работы программы", *firstEl, *lastEl, tVar;
    int lenVar;
Abbattar
1 / 1 / 0
Регистрация: 06.04.2011
Сообщений: 21
26.06.2011, 04:49  [ТС]     Неверное отображение перевёнутой строки #4
неа не пошло...
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
26.06.2011, 04:58     Неверное отображение перевёнутой строки #5
Добавьте setlocale(LC_ALL,"rus"); после int main() {
Abbattar
1 / 1 / 0
Регистрация: 06.04.2011
Сообщений: 21
26.06.2011, 05:19  [ТС]     Неверное отображение перевёнутой строки #6
похоже не в локале дело.. опять мимо
Bers
Заблокирован
26.06.2011, 09:49     Неверное отображение перевёнутой строки #7
добавьте:
SetConsoleOutputCP(1251); SetConsoleCP(1251); //не удалять! Русский букв!!!
rangerx
1932 / 1541 / 141
Регистрация: 31.05.2009
Сообщений: 2,911
26.06.2011, 13:53     Неверное отображение перевёнутой строки #8
Скорее всего исходник сохранён в юникоде, следовательно и строковый литерал содержащий кириллицу получается не совсем таким, каким кажется )
easybudda
Эксперт CЭксперт С++
9468 / 5481 / 927
Регистрация: 25.07.2009
Сообщений: 10,505
26.06.2011, 13:57     Неверное отображение перевёнутой строки #9
Цитата Сообщение от Bers Посмотреть сообщение
SetConsoleOutputCP(1251); SetConsoleCP(1251);
Только при этом в свойствах консоли шрифт должен быть установлен LucidaConsole, иначе ничего не выйдет.
Abbattar, напишите
C++
1
char str[] = "this is the test program";
и голову себе не пока не забивайте. Если в таком виде всё заработает, попробуйте эту тему почитать...
Abbattar
1 / 1 / 0
Регистрация: 06.04.2011
Сообщений: 21
26.06.2011, 14:30  [ТС]     Неверное отображение перевёнутой строки #10
Менял в консоли кодировки, и посмотрел по знакам - все знаки (вместо букв) отображаются верно кроме utf кодировки.

Добавлено через 5 минут
Менял в консоли кодировки, и посмотрел по знакам - все знаки (вместо букв) отображаются верно кроме utf кодировки.
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
26.06.2011, 14:49     Неверное отображение перевёнутой строки #11
Сообщение было отмечено автором темы, экспертом или модератором как ответ
С UTF-8 нельзя работать как с набором однобайтовых символов, поскольку разные символы занимают в памяти разное количество байтов (от 1 до 4). Чтобы применять исходный алгоритм к строке в кодировке UTF-8 надо сначала перевести строку из многобайтового представления в представление "широкими" символами wchar_t (например с помощью mbstowcs) после чего с такой строкой можно работать как в исходной программе. А для вывода надо будет перевести обратно.

Добавлено через 10 минут
Вот упрощённый вариант. На самом деле надо добавить ещё определение размера буфера, достаточного для "широкой" строки.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
 
int main(){
    
    wchar_t wstr[256], *firstEl, *lastEl, tVar;
    char str[] = "Это проверка работы программы";
    int lenVar;
    
    setlocale(LC_ALL, "");
    setlocale(LC_NUMERIC, "C");
    cout << "\nИсходная строка: " << str << "\n\n";
    mbstowcs(wstr, str, 256);
    
    lenVar = wcslen(wstr);
    
    firstEl = wstr;
    lastEl = &wstr[lenVar - 1];
    
    while(firstEl < lastEl){
        
        /* произведём обмен символами */
        
        tVar = *firstEl;
        *firstEl = *lastEl;
        *lastEl = tVar;
        
        /* Продвинем указатели */
        
        firstEl++;  lastEl--;
    }
    
    wcstombs(str, wstr, strlen(str)+1);
    cout << "Перевёрнутая строка: " << str << "\n\n";
    
    return 0;
}
Abbattar
1 / 1 / 0
Регистрация: 06.04.2011
Сообщений: 21
26.06.2011, 15:40  [ТС]     Неверное отображение перевёнутой строки #12
Цитата Сообщение от grizlik78 Посмотреть сообщение
С UTF-8 нельзя работать как с набором однобайтовых символов, поскольку разные символы занимают в памяти разное количество байтов (от 1 до 4). Чтобы применять исходный алгоритм к строке в кодировке UTF-8 надо сначала перевести строку из многобайтового представления в представление "широкими" символами wchar_t (например с помощью mbstowcs) после чего с такой строкой можно работать как в исходной программе. А для вывода надо будет перевести обратно.
именно ваш вариант сработал, спсб )) Вот вывод программы:

Код
Исходная строка: Это проверка работы программы

Перевёрнутая строка: ыммаргорп ытобар акреворп отЭ
Abbattar
1 / 1 / 0
Регистрация: 06.04.2011
Сообщений: 21
07.08.2011, 10:46  [ТС]     Неверное отображение перевёнутой строки #13
Теперь такой же фокус нужно проделать с рекурсивной функцией:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
using namespace std;
 
void reverse(char *s);
 
int main(){
  
  char str[] = "\nЭто проверка 1 2 3 4 5 ...";
  
  cout << "\n";
  
  reverse(str);
  
  cout << "\n";
  
  return 0;
}
 
void reverse(char *s){
  
  if(*s)
    reverse(s + 1);
  else
    return;
  
  cout << *s;
}
помогите, люди добрые )))
.
kazak
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
07.08.2011, 13:44     Неверное отображение перевёнутой строки #14
Цитата Сообщение от Abbattar Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
void reverse(char *s){
  
  if(*s)
    reverse(s + 1);
  else
    return;
  
  cout << *s;
}
Попробуй так
C++
1
2
3
4
5
6
7
void reverse(char *s){
  
  if(*s == '\0')
     return;
  reverse(s + 1);
  cout << s[0];
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.08.2011, 16:45     Неверное отображение перевёнутой строки
Еще ссылки по теме:

Неверное объявление scanf - C++
Решил попробовать C-шный ввод/вывод #include &lt;stdio.h&gt; #include &lt;conio.h&gt; int main() { float a = 10.111; printf(&quot;a=...

Неверное использование typedef в классе ? - C++
Есть код: template&lt;typename type, size_t arr_size&gt; class array { type arr; public: typedef type* iterator; typedef...

Функция возвращает неверное значение - C++
Здравствуйте. Подскажите, пожалуйста, почему одна из двух функций возвращает неверное значение, хотя по алгоритму работы они схожи и...

Неверное считывание символов русского языка - C++
Visual Studio 2013. При считывании русских символов всеми возможными средствами (cin, scanf, getch и др.) считывается неверный код, который...

Выводит неверное значение переменной sum - C++
выводит неверное значение sum, что не так? //--------------------------------------------------------------------------- ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
easybudda
Эксперт CЭксперт С++
9468 / 5481 / 927
Регистрация: 25.07.2009
Сообщений: 10,505
07.08.2011, 16:45     Неверное отображение перевёнутой строки #15
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
 
void wcbuf_reverse(wchar_t * bufFirst, wchar_t * bufLast){
    if ( bufFirst < bufLast ){
        wchar_t ch = *bufFirst;
        *bufFirst = *bufLast;
        *bufLast = ch;
        wcbuf_reverse(bufFirst + 1, bufLast - 1);
    }
}
 
wchar_t * wcs_reverse(wchar_t * str){
    wcbuf_reverse(str, str + wcslen(str) - 1);
    return str;
}
 
int main(void){
    wchar_t buf[BUFSIZ];
    
    setlocale(LC_ALL, "");
    while ( printf("%ls: ", L"Строка") && scanf("%l[^\n]%*c", buf) == 1 )
        printf("%ls: %ls\n", L"Реверс", wcs_reverse(buf));
    
    return 0;
}
Неверное отображение перевёнутой строки
Yandex
Объявления
07.08.2011, 16:45     Неверное отображение перевёнутой строки
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru