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

Ошибка вывода букв - C++

Восстановить пароль Регистрация
 
bossman
4 / 4 / 0
Регистрация: 20.06.2010
Сообщений: 147
14.04.2011, 19:02     Ошибка вывода букв #1
Использую код для русских букв. На первой итерацци правильно отображает русский текст, а потом почемуто путает буквы. Сначала выдает как надо:"\nВведите через пробел номера вершин,\
между которыми определяется путь", вторая строка:"\nВведиве зеаез паобел номеаа веаиин,\..." То есть почему то ошибка для букв после "п" вверх по алфавиту на 16 букв
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
char *rus(char *st)
{
 unsigned char *p=st;
  while(*p)
  {
    if(*p>191)
      if (*p<=239)
        *p-=64;// А,Б,В ... Я,а,б,в ... п
      else
        *p-=16; // р ... я
    p++;
  }
 
  return st;
}
int _tmain(int argc, _TCHAR* argv[])
{
int n=0;
while(n++<2)
{
        printf(rus("\nВведите через пробел номера вершин,\
между которыми определяется путь"));
}
getche();
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.04.2011, 19:02     Ошибка вывода букв
Посмотрите здесь:

Циклический сдвиг, ошибка вывода. C++
C++ Массив. Ошибка вывода
C++ Ошибка вывода данных в файл
ошибка вывода C++
C++ Ошибка вывода строки на экран
C++ Программа для вывода русских букв
C++ Ошибка вывода текста на экран
Ошибка вывода на консоль C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
garkeP91
49 / 49 / 5
Регистрация: 24.10.2010
Сообщений: 131
14.04.2011, 19:26     Ошибка вывода букв #2
Какая то странная функция rus. Вот так эта функция работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
std::string rus(const std::string s)
{
        std::string s2(s);
        for (unsigned i=0; i<s2.length(); i++)
                if (s2[i] < 0) 
                {
                        if (s2[i] >= -16) s2[i] -= 16;  // р-я
                        else if (s2[i] >= -64) s2[i] -= 64;// А-Я, а-п
                        else if (s2[i] == -88) s2[i] = -16;// Ё
                        else if (s2[i] == -72) s2[i] = -15;// ё
                        else if (s2[i] == -71) s2[i] = -4;      // №
                        else s2[i] = ' ';       // остальные символы CP1251
                }
        return s2;
}
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
14.04.2011, 19:56     Ошибка вывода букв #3
bossman, вы в rus переписываете то, что было передано по указателю при вызове. В вашем случае - константу. Естественно оно будет поганить её. Хотя у меня вообще вылетает. Не переписывайте константы. Делайте либо так:

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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
char *rus( char *st )
{
  char *p = st;
 
  while( *p )
  {
        if ( *p >= 'А' && *p <= 'п' )
          *p -= 64;// А,Б,В ... Я,а,б,в ... п
        else if( *p >= 'р' && *p <= 'я' )
          *p -= 16;// р ... я
 
        p++;
  }
 
  return st;
}
 
int main(int argc, char* argv[])
{
        int n=0;
        while(n++<2)
        {
            char str[255];
            strcpy( str, "\nВведите через пробел номера вершин, между которыми определяется путь" );
 
            puts( rus(str) );
        }
 
        return 0;
}
либо так:

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
40
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
char *rus( char *st )
{
  char * ret = (char*)malloc( strlen(st) * sizeof st );
  char * p = ret;
 
  strcpy( p, st );
 
  while( *p )
  {
        if ( *p >= 'А' && *p <= 'п' )
          *p -= 64;// А,Б,В ... Я,а,б,в ... п
        else if( *p >= 'р' && *p <= 'я' )
          *p -= 16;// р ... я
 
        p++;
  }
 
  return ret;
}
 
int main(int argc, char* argv[])
{
    int n=0;
    while(n++<2)
    {
        char * rus_str = rus( "\nВведите через пробел номера вершин, между которыми определяется путь" );
 
        puts( rus_str );
 
        free( rus_str ); // освободите потом!
    }
 
    system( "pause" );
 
    return 0;
}
Но оба варианта некрасивые. В идеале - сохраняйте исходник в кодировке DOS866, либо ипользуйте widechar и локали:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdlib.h>
#include <wchar.h>
#include <locale.h>
 
int main(int argc, char* argv[])
{
    setlocale( LC_ALL, "rus_rus.866" );
 
    int n = 0;
    while( n++ < 2 )
    {
        wprintf( L"Введите через пробел номера вершин, между которыми определяется путь\n" );
    }
 
    system( "pause" );
 
    return 0;
}
Добавлено через 1 минуту
Либо, если вам не обязателен C, делайте как garkeP91. Но лучше с кодировкой (смысл перекодировать данные в процессе работы?) или с локалями.
Yandex
Объявления
14.04.2011, 19:56     Ошибка вывода букв
Ответ Создать тему
Опции темы

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