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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
Abbattar
 Аватар для Abbattar
1 / 1 / 0
Регистрация: 06.04.2011
Сообщений: 21
26.06.2011, 03:26     Неверное отображение перевёнутой строки #1
Код переписан из учебника "Шаг за шагом. С++" Г.Шилдта

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)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
xAtom
 Аватар для xAtom
910 / 735 / 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
Каратель
Эксперт C++
6542 / 3962 / 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
 Аватар для Abbattar
1 / 1 / 0
Регистрация: 06.04.2011
Сообщений: 21
26.06.2011, 04:49  [ТС]     Неверное отображение перевёнутой строки #4
неа не пошло...
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
26.06.2011, 04:58     Неверное отображение перевёнутой строки #5
Добавьте setlocale(LC_ALL,"rus"); после int main() {
Abbattar
 Аватар для 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
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
26.06.2011, 13:53     Неверное отображение перевёнутой строки #8
Скорее всего исходник сохранён в юникоде, следовательно и строковый литерал содержащий кириллицу получается не совсем таким, каким кажется )
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
26.06.2011, 13:57     Неверное отображение перевёнутой строки #9
Цитата Сообщение от Bers Посмотреть сообщение
SetConsoleOutputCP(1251); SetConsoleCP(1251);
Только при этом в свойствах консоли шрифт должен быть установлен LucidaConsole, иначе ничего не выйдет.
Abbattar, напишите
C++
1
char str[] = "this is the test program";
и голову себе не пока не забивайте. Если в таком виде всё заработает, попробуйте эту тему почитать...
Abbattar
 Аватар для Abbattar
1 / 1 / 0
Регистрация: 06.04.2011
Сообщений: 21
26.06.2011, 14:30  [ТС]     Неверное отображение перевёнутой строки #10
Менял в консоли кодировки, и посмотрел по знакам - все знаки (вместо букв) отображаются верно кроме utf кодировки.

Добавлено через 5 минут
Менял в консоли кодировки, и посмотрел по знакам - все знаки (вместо букв) отображаются верно кроме utf кодировки.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
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
 Аватар для 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
 Аватар для 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
 Аватар для kazak
3029 / 2350 / 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];
}
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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;
}
Неверное отображение перевёнутой строки
Abbattar
 Аватар для Abbattar
1 / 1 / 0
Регистрация: 06.04.2011
Сообщений: 21
08.08.2011, 01:05  [ТС]     Неверное отображение перевёнутой строки #16
хм ! посмотрим, спасибо ))

Добавлено через 14 минут
Цитата Сообщение от kazak Посмотреть сообщение
Попробуй так
C++
1
2
3
4
5
6
7
void reverse(char *s){
  
  if(*s == '\0')
     return;
  reverse(s + 1);
  cout << s[0];
}
Спасибо, но не в том дело, мне нужно правильное отображениии кириллицы, на латыни то всё верно отображается ))
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
08.08.2011, 01:16     Неверное отображение перевёнутой строки #17
В некотором смысле эта программа даже проще предыдущей моей.
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
#include <iostream>
#include <cstring>
#include <cstdlib>
 
using namespace std;
 
void reverse(char *s);
 
int main(){
    setlocale(LC_ALL, "");
    setlocale(LC_NUMERIC, "C");
 
    char str[] = "\nЭто проверка 1 2 3 4 5 ...";
 
    cout << "\n";
 
    reverse(str);
 
    cout << "\n";
 
    return 0;
}
 
char buf[8];
 
void reverse(char *s){
    int bytes;
    if ((bytes = mbtowc(NULL, s, 7)) > 0)
        reverse(s + bytes);
    else
        return;
    memcpy(buf, s, bytes);
    buf[bytes] = '\0';
    cout << buf;
}
Abbattar
 Аватар для Abbattar
1 / 1 / 0
Регистрация: 06.04.2011
Сообщений: 21
08.08.2011, 01:45  [ТС]     Неверное отображение перевёнутой строки #18
Цитата Сообщение от easybudda Посмотреть сообщение
C
1
2
3
4
5
6
7
8
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
 
......
 
      return 0;
}
Вложение 90828
До этого пока мне далековато )) Спасибо, пойду учить дальше...
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
08.08.2011, 01:52     Неверное отображение перевёнутой строки #19
Кстати, если разрешить рекурсивной функции менять строку, то функция становится ещё чуток проще и ближе к оригиналу. Для этого перед переворачиванием строка дублируется.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void reverse_recursive(char *s){
    int bytes;
    if ((bytes = mbtowc(NULL, s, 7)) > 0)
        reverse_recursive(s + bytes);
    else
        return;
    cout << s;
    *s = '\0';
}
 
void reverse(char *s){
    char *tmp = strdup(s);
    reverse_recursive(tmp);
    free(tmp);
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.08.2011, 02:32     Неверное отображение перевёнутой строки
Еще ссылки по теме:

Выводит неверное значение переменной sum C++
C++ Isalpha;isdigit неверное употребление функций?
Неверное объявление scanf C++

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

Или воспользуйтесь поиском по форуму:
Abbattar
 Аватар для Abbattar
1 / 1 / 0
Регистрация: 06.04.2011
Сообщений: 21
08.08.2011, 02:32  [ТС]     Неверное отображение перевёнутой строки #20
Цитата Сообщение от grizlik78 Посмотреть сообщение
В некотором смысле эта программа даже проще предыдущей моей.
Да это именно то, что мне нужно было, но комментарии были бы не лишними :-)
Yandex
Объявления
08.08.2011, 02:32     Неверное отображение перевёнутой строки
Ответ Создать тему
Опции темы

Текущее время: 23:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru