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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Sheffs
1 / 1 / 0
Регистрация: 31.05.2013
Сообщений: 14
#1

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

31.05.2013, 02:15. Просмотров 1421. Ответов 9
Метки нет (Все метки)

Всем привет. У меня такая проблема. Программа не хочет обрабатывать кириллицу. К примеру, у меня задача, подсчитать в последнем слове текста количество буквы "к". Если я ввожу текст на английском и ищу букву "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;
}
0
Миниатюры
Программа не обрабатывает кириллицу  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.05.2013, 02:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Программа не обрабатывает кириллицу (C++):

Программа не обрабатывает условие while() - C++
Не работает условие остановки цикла, методом проб выяснилось что while не нравится тип переменной float, но у меня не целые числа, и int не...

Программа не обрабатывает файлы больше 100 килобайт - C++
валится при изменении константы MAXFILESIZE. Надо чтобы программа обрабатывала файлы больше 100кб. Было переполнение стека, но я...

Программа не обрабатывает текст из файла с кодировкой, отличной от ANSI - C++
Здравствуйте. Имеется программка, которая читает текст из файла, обрабатывает его и записывает результат в другой текстовый файл. Проблема:...

Программа читает свой текст и обрабатывает его по заданному в варианте условию - C++
написать программу, которая читает свой текст и обрабатывает его по заданному в варианте условию. Результаты обработки записать в фаил...

Создание динамического массива, передача аргументов функции по ссылке. Программа обрабатывает результаты матча - C++
Разработать программу, предназначенную для обработки информации о матчах, сыгранных футбольной командой. Количество сыгранных матчей и...

Не отображает кириллицу! - C++
#include &lt;iostream&gt; #include &lt;map&gt; #include &lt;string&gt; #include &lt;list&gt; using namespace std; int main () { setlocale (LC_ALL,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Nikoys
26 / 26 / 6
Регистрация: 29.12.2010
Сообщений: 90
31.05.2013, 02:33 #2
Какая строка в вашей программе 68я? (обратите внимание на описание ошибки)
Прошу прощения, понял, что 68я строка в isctype.c

Добавлено через 6 минут
Запустил под Code::Blocks - все работает.
0
Croessmah
Эксперт CЭксперт С++
13226 / 7498 / 845
Регистрация: 27.09.2012
Сообщений: 18,417
Записей в блоге: 3
Завершенные тесты: 1
31.05.2013, 02:36 #3
Либо запускайте в релизе, либо приводите к unsigned char символы при передаче си функциям:
C++
1
isspace((unsigned char)A[i])
0
Sheffs
1 / 1 / 0
Регистрация: 31.05.2013
Сообщений: 14
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;
}
0
Croessmah
Эксперт CЭксперт С++
13226 / 7498 / 845
Регистрация: 27.09.2012
Сообщений: 18,417
Записей в блоге: 3
Завершенные тесты: 1
31.05.2013, 02:43 #5
Цитата Сообщение от Sheffs Посмотреть сообщение
В этой программе, почему то, все прекрасно читает и обрабатывает.
Здесь нет функций на подобии isspace,isdigit,isalpha и т.д., поэтому и работает.
Ваш код в шапке так же будет работать в релиз сборке. Да и в дебаге можно нажать "продолжить", либо как я написал уже привести аргумент к unsigned char
1
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. Что ж, вот где собака зарыта. Буду и сам на будущее знать.
0
Sheffs
1 / 1 / 0
Регистрация: 31.05.2013
Сообщений: 14
31.05.2013, 02:52  [ТС] #7
Croessmah, Благодарю. Заработало. Можно поинтересоваться, собственно, в чем волшебство? в чем была проблема?
0
Nikoys
26 / 26 / 6
Регистрация: 29.12.2010
Сообщений: 90
31.05.2013, 02:52 #8
Sheffs, Code::Blocks - другое IDE для С++. Только, в отличие от Visual Studio, в основе лежит компилятор GCC.
0
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
31.05.2013, 03:07 #9
это не ошибка компилятора. это такая реализация стандартной библиотеке, в частности той функции, откуда вылетает ассерт. его туда намеренно поставили, чтобы разработчики обратили внимание на то, что их код как-то неправильно использует функцию. как такое получилось мне непонятно. нужно дебажить. проверка такая там:
_ASSERTE((unsigned)(c + 1) <= 256);
т.е. переданный в функцию символ выходит за пределы диаппазона [0...255]. например каким-то макаром на обработку попали чары с отрицательными значениями.
0
Croessmah
Эксперт CЭксперт С++
13226 / 7498 / 845
Регистрация: 27.09.2012
Сообщений: 18,417
Записей в блоге: 3
Завершенные тесты: 1
31.05.2013, 03:08 #10
Цитата Сообщение от Sheffs Посмотреть сообщение
в чем была проблема?
Потому что вот что стоит в isctype.c
C++
1
_ASSERTE(c >= -1 && c <= 255);
C++
1
_ASSERTE(( unsigned )(c + 1) <= 256);
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.05.2013, 03:08
Привет! Вот еще темы с ответами:

Не воспринимает кириллицу - C++
Есть программа - вводим текст, выводит самое длинное слово. #include &lt;iostream&gt; using namespace std; char longest_word; unsigned...

Кириллицу в UTF-8 - C++
К примеру, у нас есть строка &quot;тест&quot;, нужно из него получить строку D1%82%D0%B5%D1%81%D1%82 для запроса

Перевод транслита в кириллицу - C++
Добрый день, кодеры! Возникла, значит, проблема: переводил текст с русского (с помощью cin.peek и cin.putback). Вроде что то нацарапал. А...

Борьба за кириллицу в MS Visual C++ 6.0 - C++
Для того, что бы выводились символы русского алфавита я знаю такой метод: #include &lt;iostream.h&gt; #include &lt;windows.h&gt; // для...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
31.05.2013, 03:08
Ответ Создать тему
Опции темы

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