Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
XaKO
21 / 21 / 30
Регистрация: 23.10.2012
Сообщений: 344
#1

Неправильное отображение русских символов в string - C++

15.11.2014, 12:17. Просмотров 886. Ответов 14
Метки нет (Все метки)

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
#include "stdafx.h"
#include "string"
#include "iostream"
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    string s;
    int CountL;
    int a[256] = { 0 };
    setlocale(LC_ALL, "rus");
    cout << "Введите строку: \n";
    std::getline(cin,s);
    CountL = 0;
    cout << "Количество вхождений каждого символа: \n";
    for (unsigned int i = 0; i < s.length(); i++)
    {
        a[s[i]]++;
        if (isalpha(s[i]))
            CountL++;
    }
    for (int i = 0; i <= 255; ++i)
    {
        if (a[i] != 0)
            cout << char(i) << ' ' << a[i] << endl;
    }
    cout << "Количество букв в строке: \n";
    cout << CountL << '\n';
    system("pause");
    return 0;
}
Все хорошо работает для всех символов ASCII кроме русских. Как решить, не прибегая к серьезным изменениям в программе?
http://www.cyberforum.ru/cpp-beginners/thread1311182.html
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2014, 12:17
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Неправильное отображение русских символов в string (C++):

Неправильное отображение в консоли
Наверное глупый вопрос но не могу понять почему консоль не принимает значение с...

Как настроить ввод русских символов и в дальнейшем вывод этих символов
Подскажите как в этом коде настроить ввод русских символов и в дальнейшем вывод...

Неправильное отображение элементов массива
Здравствуйте! есть прога: #include &lt;iostream&gt; #include &lt;ctime&gt; #include...

Неправильное отображение в консоли пути
#include &lt;iostream&gt; #include &lt;fstream&gt; // работа с файлами #include &lt;iomanip&gt;...

Отображение русских шрифтов
После того как я успешно разобрался с процессом компиляции, у меня тут...

14
nmcf
6237 / 5549 / 2524
Регистрация: 14.04.2014
Сообщений: 23,337
15.11.2014, 12:26 #2
Вводи как char[], перекодируй и потом уже в string
C++
1
2
3
4
#include <windows.h>
char s[100];
...
OemToCharA(s, s);
isalpha() лучше из locale.
C++
1
2
3
4
5
#include <locale>
 
rl = locale("");
 
isalpha(s[i], rl))
1
XaKO
21 / 21 / 30
Регистрация: 23.10.2012
Сообщений: 344
15.11.2014, 12:33  [ТС] #3
C++
1
char s[100];
меня все устраивает кроме этого, потому что текст может быть любой длины(от предложения до сборника стихов Есенина)
0
nmcf
6237 / 5549 / 2524
Регистрация: 14.04.2014
Сообщений: 23,337
15.11.2014, 12:41 #4
Тогда ввод оставляешь как есть, но после создаёшь динамический массив char нужного размера, копируешь, конвертируешь и возвращаешь назад.
Ну или смотри любимую тему http://www.cyberforum.ru/cpp-beginners/thread10662.html
Там переключения кодировок и прочее.
0
XaKO
21 / 21 / 30
Регистрация: 23.10.2012
Сообщений: 344
15.11.2014, 13:37  [ТС] #5
C++
1
2
3
4
5
6
    std::getline(cin,s);
    char *d = new char[s.length()];
    // как записать в массив строку?
    CharToOemA(d, d);
    s = d + '\n';
    delete[] d;
0
nmcf
6237 / 5549 / 2524
Регистрация: 14.04.2014
Сообщений: 23,337
15.11.2014, 14:34 #6
C++
1
2
3
char *d = new char[s.length() + 1];
strcpy(d, s.c_str());
CharToOemA(d, d);
1
XaKO
21 / 21 / 30
Регистрация: 23.10.2012
Сообщений: 344
15.11.2014, 15:36  [ТС] #7
HTML5
1
error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
Ошибка на
C++
1
strcpy(d, s.c_str());
При замене ошибка, что функция не принимает 2 аргумента, откуда его взять?
HTML5
1
2
3
4
5
6
strDestination
Расположение буфера строки назначения.
numberOfElements
Размер буфера строки назначения.   ВОТ ЭТОТ
strSource
Буфер строки источника с нулевым завершением.
Использую VS 2013

P.S этот си меня заманал уже)
0
DrOffset
7517 / 4513 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
15.11.2014, 15:49 #8
Цитата Сообщение от XaKO Посмотреть сообщение
При замене ошибка, что функция не принимает 2 аргумента, откуда его взять?
Это максимальный размер твоего d, т.е. s.length() + 1.

Цитата Сообщение от XaKO Посмотреть сообщение
P.S этот си меня заманал уже)
Да брось уже его
0
XaKO
21 / 21 / 30
Регистрация: 23.10.2012
Сообщений: 344
15.11.2014, 16:01  [ТС] #9
HTML5
1
2
3
4
5
6
7
8
9
Введите строку:
куку
// после перекодировки chartooem
т?т?
Количество вхождений каждого символа:
  2
Количество букв в строке:
3
Для продолжения нажмите любую клавишу . . ..
Это не неожиданный результат...

Добавлено через 7 минут
HTML5
1
2
// после присваивания s
т?т?<<<юою
0
nmcf
6237 / 5549 / 2524
Регистрация: 14.04.2014
Сообщений: 23,337
15.11.2014, 16:07 #10
Отключи проверку, вот так: "В самом проекте проверка SDL отключается следующим образом: Проект->Свойства: %имя проекта%->C/C++ ->Проверки SDL->Нет(/sdl-)"

Добавлено через 5 минут
Функцию обратная. Я первый раз правильно написал, второй - перепутал. Вот:
C++
1
2
3
4
5
6
7
8
9
    locale::global(locale(""));
    string s;
    cin >> s;
char *d = new char[s.length() + 1];
strcpy(d, s.c_str());
OemToCharA(d, d);
s = d;
delete[] d;
cout << s << endl;
0
XaKO
21 / 21 / 30
Регистрация: 23.10.2012
Сообщений: 344
15.11.2014, 16:11  [ТС] #11
Отключил, написал как было, все равно это т?т? остается.

Посмотрю сейчас.

Добавлено через 3 минуты
А в чем отличие?

Добавлено через 30 секунд
\n я у себя убрал
0
nmcf
6237 / 5549 / 2524
Регистрация: 14.04.2014
Сообщений: 23,337
15.11.2014, 16:27 #12
OemToCharA() - из 866 в 1251 - (твоя)
CharToOemA() - из 1251 в 866

Добавлено через 4 минуты
Ты покажи, что там у тебя получилось (программу).
0
XaKO
21 / 21 / 30
Регистрация: 23.10.2012
Сообщений: 344
15.11.2014, 16:35  [ТС] #13
Да, и правда)
Но на этом проблемы не кончились) Теперь код символов читается по-левому, и из-за этого не считаются вхождения. Наверно, так уж устроено, даже тут буржуйский язык издевается над русским.

Добавлено через 41 секунду
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
#include "stdafx.h"
#include <windows.h>
#include "string"
#include "iostream"
#include "locale"
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    string s;
    int CountL;
    int a[256] = { 0 };
    setlocale(LC_ALL, "rus");
    cout << "Введите строку: \n";
    std::getline(cin,s);
    char *d = new char[s.length() + 1];
    strcpy(d, s.c_str());
    OemToCharA(d, d);
    s = d;
    delete[] d;
    CountL = 0;
    cout << "Количество вхождений каждого символа: \n";
    for (unsigned int i = 0; i < s.length(); i++)
    {
        a[s[i]]++;
        if (isalpha(s[i],locale("")))
            CountL++;
    }
    for (int i = 0; i <= 255; ++i)
    {
        if (a[i] != 0)
            cout << char(i) << ' ' << a[i] << endl;
    }
    cout << "Количество букв в строке: \n";
    cout << CountL << '\n';
    system("pause");
    return 0;
}
0
nmcf
6237 / 5549 / 2524
Регистрация: 14.04.2014
Сообщений: 23,337
15.11.2014, 17:17 #14
Лучший ответ Сообщение было отмечено XaKO как решение

Решение

При обращении к масииву тип не приводишь к беззнаковому. Вот как надо:
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
int main()
{
    locale::global(locale(""));
 
    string s;
    int CountL;
    int a[256] = { 0 };
    cout << "Введите строку: \n";
    std::getline(cin,s);
    char *d = new char[s.length() + 1];
    strcpy(d, s.c_str());
    OemToCharA(d, d);
    s = d;
    delete[] d;
    CountL = 0;
    cout << "Количество вхождений каждого символа: \n";
    for (unsigned int i = 0; i < s.length(); i++)
    {
        a[(unsigned char)s[i]]++;
        if (isalpha(s[i],locale("")))
            CountL++;
    }
    for (int i = 0; i < 256; ++i)
    {
        if (a[i] != 0)
        {
            cout << (char)i << ' ' << a[i] << endl;
        }
    }
    cout << "Количество букв в строке: \n";
    cout << CountL << '\n';
    system("pause");
    return 0;
}
1
XaKO
21 / 21 / 30
Регистрация: 23.10.2012
Сообщений: 344
15.11.2014, 17:21  [ТС] #15
Аллилуйя! Это победа.
0
15.11.2014, 17:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2014, 17:21
Привет! Вот еще темы с решениями:

Сравнение русских символов.
Проблема с русскими символами. Русские символы заносятся в массив занимая две...

Ввод русских символов.
Здравствуйте, простите пожалуйста что отвлекаю, я хотел бы спросить как сделать...

Удалить конец строки символов. Ввести кол-во удаляемых символов , вывести результат ,String ,задачка,С++
Удалить конец строки символов. Ввести количество удаляемых символов , вывести...

ASCII игра из русских символов
В общем решил написать небольшую консольную игру, все игровые объекты будут...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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