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

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

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

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

26.06.2011, 03:26. Просмотров 1399. Ответов 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;
}
вывод программы, такой:

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

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

Неверное отображение кириллических символов в консоли - 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(); // меню...

Неверное деление - C++
#include &lt;iostream&gt; #include &lt;iomanip&gt; using namespace std; int main () { float temp = 0; temp = 5/100; ...

21
xAtom
915 / 740 / 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();
}
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 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;
0
Abbattar
1 / 1 / 0
Регистрация: 06.04.2011
Сообщений: 21
26.06.2011, 04:49  [ТС] #4
неа не пошло...
0
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
26.06.2011, 04:58 #5
Добавьте setlocale(LC_ALL,"rus"); после int main() {
0
Abbattar
1 / 1 / 0
Регистрация: 06.04.2011
Сообщений: 21
26.06.2011, 05:19  [ТС] #6
похоже не в локале дело.. опять мимо
0
Bers
Заблокирован
26.06.2011, 09:49 #7
добавьте:
SetConsoleOutputCP(1251); SetConsoleCP(1251); //не удалять! Русский букв!!!
0
rangerx
1935 / 1544 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
26.06.2011, 13:53 #8
Скорее всего исходник сохранён в юникоде, следовательно и строковый литерал содержащий кириллицу получается не совсем таким, каким кажется )
0
easybudda
Модератор
Эксперт CЭксперт С++
9683 / 5633 / 956
Регистрация: 25.07.2009
Сообщений: 10,811
26.06.2011, 13:57 #9
Цитата Сообщение от Bers Посмотреть сообщение
SetConsoleOutputCP(1251); SetConsoleCP(1251);
Только при этом в свойствах консоли шрифт должен быть установлен LucidaConsole, иначе ничего не выйдет.
Abbattar, напишите
C++
1
char str[] = "this is the test program";
и голову себе не пока не забивайте. Если в таком виде всё заработает, попробуйте эту тему почитать...
0
Abbattar
1 / 1 / 0
Регистрация: 06.04.2011
Сообщений: 21
26.06.2011, 14:30  [ТС] #10
Менял в консоли кодировки, и посмотрел по знакам - все знаки (вместо букв) отображаются верно кроме utf кодировки.

Добавлено через 5 минут
Менял в консоли кодировки, и посмотрел по знакам - все знаки (вместо букв) отображаются верно кроме utf кодировки.
0
grizlik78
Эксперт С++
1964 / 1457 / 119
Регистрация: 29.05.2011
Сообщений: 3,016
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;
}
4
Abbattar
1 / 1 / 0
Регистрация: 06.04.2011
Сообщений: 21
26.06.2011, 15:40  [ТС] #12
Цитата Сообщение от grizlik78 Посмотреть сообщение
С UTF-8 нельзя работать как с набором однобайтовых символов, поскольку разные символы занимают в памяти разное количество байтов (от 1 до 4). Чтобы применять исходный алгоритм к строке в кодировке UTF-8 надо сначала перевести строку из многобайтового представления в представление "широкими" символами wchar_t (например с помощью mbstowcs) после чего с такой строкой можно работать как в исходной программе. А для вывода надо будет перевести обратно.
именно ваш вариант сработал, спсб )) Вот вывод программы:

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

Перевёрнутая строка: ыммаргорп ытобар акреворп отЭ
0
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;
}
помогите, люди добрые )))
.
0
kazak
3038 / 2359 / 157
Регистрация: 11.03.2009
Сообщений: 5,405
Завершенные тесты: 1
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];
}
0
easybudda
Модератор
Эксперт CЭксперт С++
9683 / 5633 / 956
Регистрация: 25.07.2009
Сообщений: 10,811
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;
}
Неверное отображение перевёнутой строки
0
07.08.2011, 16:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.08.2011, 16:45
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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