Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиПоискОблакоVK ComboВсе проекты

Ошибка с русскими символами в языке C++ программе xcode. Пропадает если указать большее количество элементов в строке.

dillonx 713 Ученик (93), закрыт 8 месяцев назад
Здравствуйте. Подскажите пожалуйста... Мне интересно, почему у меня выпадает ошибка с русскими символами. Я новичок и мне на учеба дали задание, написать код, чтобы можно было проверить можно ли из символов первой строки составить вторую.
Если введу это же слово, но на английском, выпадет ответ, что можно. Если на русском, то нельзя и вот эта ошибка в которой я вообще пока не разбираюсь. Хотя встречаю не впервые.
Если в размере строки введу не 10, а к примеру 100, то ответ в консоли выдаст, что можно. Что я и сделаю. Но мне интересно, почему с русскими буквами такая проблема и как этого
избежать в будущем.
Лучший ответ
Сергей Гений (54561) 9 месяцев назад
Не было возможности проверить все прелести кодировки на unix подобных системах с нативным UTF8...
Ваш код предназначен для однобайтных текстов, и для того чтобы в нем работала кириллица, требуется выбор специфической однобайтной кодировки.
Для того, чтобы можно было посимвольно индексировать символы с переменной длиной (utf-8) их нужно перевести в символы с постоянной длиной (UTF-32). По сути вместо однобайтных char будут аж unsigned int )
Тоесть план такой:
1 - Создаете буфер char с нужным запасом (учитывать что анлийские символы занимают один байт, кириллица - 2 байта, иероглифы - 3 байта, всякие эмодзи - до 4х)
2 - Загружаете в него текст utf-8
3 - Измеряете количество символов в нем (функцию легко написать)
4 - создаете массив 4-х байтных букв нужной длины т.е. unsigned int[размер]
5 - переписываете в него декодированные значения utf8 символов
6 - работаете с этим массивом.
Думаю должны быть библиотеки которые сделают это за вас.

В виновсе все проще - там консоль работает в однобайтной кодировке)
Остальные ответы
Федор Новиков Искусственный Интеллект (348471) 9 месяцев назад
посмотрите в отладчике содержимое массива в двоичном виде. Есть кодировки, например, UTF-8, в которых буквы разных языков занимают разный объем в памяти (2 и более байта).
dillonx 713Ученик (93) 9 месяцев назад
Спасибо. Буду учиться пользоваться отладчиком)
Unknown Unknown Гуру (4281) dillonx 713, с каких пор пробел не является символом ?
/bin/laden Оракул (97746) 9 месяцев назад
давать гетлайн массив на 10 символов и сообщать, что можно записать туда 100 - напрашиваться на очень большие неприятности.
и у тебя будет в цикле выход за пределы более короткой строки, если строки не одинаковой длины.
может через strspn что-то путное выйдет?
Unknown Unknown Гуру (4281) 9 месяцев назад
Можно так. Компилятор - Microsoft Visual C++.
 #include  
#include
#include
#include

using namespace std;

int main() {

setlocale(LC_ALL, "Russian");
string s1, s2;
cout << "Первая строка: "; cin >> s1;
cout << "Вторая строка: "; cin >> s2;
multiset mst1;
multiset mst2;

for (char c : s1) mst1.insert(c);
for (char c : s2) mst2.insert(c);

if (includes(mst1.begin(), mst1.end(), mst2.begin(), mst2.end())) cout << "Можно";
else cout << "Нельзя";

}
Похожие вопросы