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

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

Войти
Регистрация
Восстановить пароль
 
bossman
4 / 4 / 0
Регистрация: 20.06.2010
Сообщений: 147
#1

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

14.04.2011, 19:02. Просмотров 352. Ответов 2
Метки нет (Все метки)

Использую код для русских букв. На первой итерацци правильно отображает русский текст, а потом почемуто путает буквы. Сначала выдает как надо:"\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++
Всем привет. Есть пару проблем в коде: При вводе числа меньше 7 считает выдает ответ. дальше если опять введем число меньше семи ответ уже...

Ошибка вывода - C++
ребят, есть код #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;stdlib.h&gt; using namespace std; int main() { ...

Массив. Ошибка вывода - C++
подскажите где косяк? почему то выводит двыжды отсортированный массив. #include &lt;iostream&gt; #include &lt;stdio.h&gt; using namespace std;...

Ошибка вывода на консоль - C++
В Debug выводит адрес почему-то. В release же все нормально. Почему так и как это исправить? #include &lt;iostream&gt; #include &lt;string&gt; ...

Ошибка вывода или проги? - C++
Собственно элементарная задача. Упорядочить по возростанию в масиве элементы в столбцах, а затем сами столбцы по первым элементам. Сначала...

Ошибка вывода текста на экран - C++
Добрый день! Помогите разобраться. В приложении win32 нужно вывести на экран значение переменной double или float используя strstream...

Ошибка вывода строки на экран - C++
Подскажите пожалуйста в чем ошибка, задача была в том что бы создать строку которую хранит в себе пересечение двух других. Так же выслушал...

Циклический сдвиг, ошибка вывода. - C++
Задание сдвинуть строку вправо на 1 символ. В консоле после вывода пусто (выглядит так: &quot;row has been sorted: &quot;). #include...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
garkeP91
50 / 50 / 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
791 / 543 / 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     Ошибка вывода букв
Ответ Создать тему
Опции темы

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