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

Программа не обрабатывает кириллицу - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Sheffs
1 / 1 / 0
Регистрация: 31.05.2013
Сообщений: 9
31.05.2013, 02:15     Программа не обрабатывает кириллицу #1
Всем привет. У меня такая проблема. Программа не хочет обрабатывать кириллицу. К примеру, у меня задача, подсчитать в последнем слове текста количество буквы "к". Если я ввожу текст на английском и ищу букву "k", то все нормально работает. Если же я ввожу русский текст и ищу букву "к", то программа выдает ошибку (скрин выложил ниже ).
Использую
C++
1
OemToAnsi(,):
из библиотеки
C++
1
#include <windows.h>
p.s. пусть вас не пугает список библиотек, я всегда добавляю всего и побольше)))
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>
#include <windows.h>
#include <clocale>
using namespace std;
int main()
{
setlocale(LC_CTYPE,"Russian");
    static char A[512];
    cout<<"Введите текст"<<endl;
    cin.getline(A, 512);
    OemToAnsi(A,A);
    int count = 0;
    for (int i = strlen(A)-1; !isspace(A[i]) && i >= 0; i--)
        if (A[i] == 'к') count++;
    printf("%s\ncount = %d\n",A,count);
    _getch();
    return 0;
}
Миниатюры
Программа не обрабатывает кириллицу  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nikoys
26 / 26 / 6
Регистрация: 29.12.2010
Сообщений: 90
31.05.2013, 02:33     Программа не обрабатывает кириллицу #2
Какая строка в вашей программе 68я? (обратите внимание на описание ошибки)
Прошу прощения, понял, что 68я строка в isctype.c

Добавлено через 6 минут
Запустил под Code::Blocks - все работает.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11823 / 6802 / 769
Регистрация: 27.09.2012
Сообщений: 16,870
Записей в блоге: 2
Завершенные тесты: 1
31.05.2013, 02:36     Программа не обрабатывает кириллицу #3
Либо запускайте в релизе, либо приводите к unsigned char символы при передаче си функциям:
C++
1
isspace((unsigned char)A[i])
Sheffs
1 / 1 / 0
Регистрация: 31.05.2013
Сообщений: 9
31.05.2013, 02:39  [ТС]     Программа не обрабатывает кириллицу #4
Насколько я понял Code::Blocks это некая программа(возможно ошибаюсь), но этой программы, к сожалению, нету у преподавателя
Только Visual c++ 2008, увы.
Порылся тут на форуме в подобных темах, вставлял приведенные варианты, не помогало. Может быть, конечно, криво вставлял.
В этой программе, почему то, все прекрасно читает и обрабатывает.

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
#include <iostream>
#include <cstring>
#include <sstream>
#include <conio.h>
#include <stdio.h>
#include <windows.h>
#include <clocale>
 
using namespace std;
int main()
{
setlocale(LC_CTYPE,"Russian");
char str[256],temp[256];
cout<<"Введите текст"<<endl;
cin.getline(str, 256);
OemToAnsi(str,str);
puts("\nВведенная строка:"); puts(str);
int l=strlen(str),i,n=0,min,max;
istringstream ist(str);
ist>>temp;
min=max=strlen(temp);
while(ist>>temp)
{
if (strlen(temp)>max) 
max=strlen(temp);
if (strlen(temp)<min) 
min=strlen(temp);
}
cout<<"Длинна самого длинного слова:"<<max<<endl<<"Длина самого короткого слова:"<<min<<endl;
_getch();
return 0;
}
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11823 / 6802 / 769
Регистрация: 27.09.2012
Сообщений: 16,870
Записей в блоге: 2
Завершенные тесты: 1
31.05.2013, 02:43     Программа не обрабатывает кириллицу #5
Цитата Сообщение от Sheffs Посмотреть сообщение
В этой программе, почему то, все прекрасно читает и обрабатывает.
Здесь нет функций на подобии isspace,isdigit,isalpha и т.д., поэтому и работает.
Ваш код в шапке так же будет работать в релиз сборке. Да и в дебаге можно нажать "продолжить", либо как я написал уже привести аргумент к unsigned char
Nikoys
26 / 26 / 6
Регистрация: 29.12.2010
Сообщений: 90
31.05.2013, 02:50     Программа не обрабатывает кириллицу #6
Эта ошибка работает внутри Visual Studio, у меня тоже сработала эта ошибка. Хотя, в принципе, под Code::Blocks работает.
Опытным путем установлено, что вылетает программа на цикле, и не зависит от setlocale и OemToAnsi. Почему-то ей просто не нравятся русские буквы. Возможно, неправильный перевод происходит, и номер символа вылетает за границы -1...255.

Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
Либо запускайте в релизе, либо приводите к unsigned char символы при передаче си функциям:
C++
1
isspace((unsigned char)A[i])
только хотел написать, что выбивает на isspace. Что ж, вот где собака зарыта. Буду и сам на будущее знать.
Sheffs
1 / 1 / 0
Регистрация: 31.05.2013
Сообщений: 9
31.05.2013, 02:52  [ТС]     Программа не обрабатывает кириллицу #7
Croessmah, Благодарю. Заработало. Можно поинтересоваться, собственно, в чем волшебство? в чем была проблема?
Nikoys
26 / 26 / 6
Регистрация: 29.12.2010
Сообщений: 90
31.05.2013, 02:52     Программа не обрабатывает кириллицу #8
Sheffs, Code::Blocks - другое IDE для С++. Только, в отличие от Visual Studio, в основе лежит компилятор GCC.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
31.05.2013, 03:07     Программа не обрабатывает кириллицу #9
это не ошибка компилятора. это такая реализация стандартной библиотеке, в частности той функции, откуда вылетает ассерт. его туда намеренно поставили, чтобы разработчики обратили внимание на то, что их код как-то неправильно использует функцию. как такое получилось мне непонятно. нужно дебажить. проверка такая там:
_ASSERTE((unsigned)(c + 1) <= 256);
т.е. переданный в функцию символ выходит за пределы диаппазона [0...255]. например каким-то макаром на обработку попали чары с отрицательными значениями.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.05.2013, 03:08     Программа не обрабатывает кириллицу
Еще ссылки по теме:

C++ Программа не обрабатывает текст из файла с кодировкой, отличной от ANSI
Создание динамического массива, передача аргументов функции по ссылке. Программа обрабатывает результаты матча C++
C++ Программа не обрабатывает файлы больше 100 килобайт

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11823 / 6802 / 769
Регистрация: 27.09.2012
Сообщений: 16,870
Записей в блоге: 2
Завершенные тесты: 1
31.05.2013, 03:08     Программа не обрабатывает кириллицу #10
Цитата Сообщение от Sheffs Посмотреть сообщение
в чем была проблема?
Потому что вот что стоит в isctype.c
C++
1
_ASSERTE(c >= -1 && c <= 255);
C++
1
_ASSERTE(( unsigned )(c + 1) <= 256);
Yandex
Объявления
31.05.2013, 03:08     Программа не обрабатывает кириллицу
Ответ Создать тему
Опции темы

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