0
#include <iostream>
#include <string>

using namespace std;

int main()
{
    setlocale(LC_ALL, "");
    int n;
    string str;
    cout << "Введите строку: " << endl;
    cin >> str;
    int l = str.size();
    cout << l << " " << str << endl;
    for (int i=0; i<l; i++)
        cout << str[i] << " ";

    return 0;
}

Данный код считывает слово и выводит каждый его символ через пробел, но при вводе кириллицы выдается следующий результат:

Введите строку: 
цуйафы
12 цуйафы
? ? ? ? ? ? ? ? ? ? ? ?
Process exited with status 0

Проблемы начинаются при выводе размера слова, число не является правильным.

  • Размер русских букв в utf-8 2 байта. Если хотите выводить по символу, то нужно копиравать эти 2 байта в строку типа char * Как отличить однобайтный utf-8 символ от многобайтного (и узнать его длину (м.б. до 4-х байт)) см. в utf-8 – avp Dec 26 '22 at 22:34
  • есть ссылка на источник, в котором написано как это сделать? – alexey.qqq Dec 26 '22 at 22:36
  • Добро пожаловать в XXI век. Символы кодируются в Unicode. Используйте wstring со товарищи. – user_587 Dec 26 '22 at 22:44
  • @alexey.qqq По ссылке utf-8 щелкали? – avp Dec 26 '22 at 22:47
  • @user_587, для реального программирования у ввода wstring есть одна пренеприятная особенность, поток ввода необратимо портиться, если на вход подать недопустимый (не представимый в utf) символ. Так что, лучше оставайтесь в старом добром XX веке и обрабатывайте сами. Впрочем, это не мешает читать байтовый поток и переводить его в unicode (w_char) самому (ну, и самому же отвечать за все ошибки) – avp Dec 26 '22 at 22:51
  • @user_587, std::wstring не является кроссплатформенным решением - wchar_t имеет размер, зависящий от ОС и компилятора (https://en.cppreference.com/w/cpp/language/types). – Maxim Timakov Dec 26 '22 at 22:54

0 Answers0