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

Запись русских символов в char - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
08.01.2013, 16:46     Запись русских символов в char #1
Добрый день господа!!!
Мне нужно в поле char name[14] записать 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
32
33
34
35
36
37
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
using std::ios;
using std::cerr;
#include <fstream>
using std::ofstream;
using std::ifstream;
#include <cstdlib>
using std::exit;
#include <string>
using std::string;
#include <cstring>
using std::strncpy;//prinimaet 1-ykazatel6, 2-konstantnui ykazatel6, kolichestvo simvolov
 
//int menu(void);
 
int main()
{
    char name[15];
    char a[15];
    cout <<"Введите название"<<endl;
    cin.getline(name,14,'\n');//Ввожу "Шлифовальный станок
    if(cin.fail()==1)//то чистим поток
    {
        cin.clear();
        cout <<"cin.fail()= "<<cin.fail()<<endl;
        cin.ignore(1000,'\n');
    }
 
    cout <<"Введите а \n? ";
    cin >>a;
    cout <<name<<'|'<<a<<endl;
        
        return 0;
}
Компилирую программу и ввожу строчку "Шлифовальный станок".
Ну и, что же вы думаете я получаю?
Должно как бы казалось скопировать в строку char name[15] пятнадцать символов.
Вывестись должна была строчка "Шлифовальный ст".
А выводится отакая фигня "Шлифов" потом идет вопросик ?
В чем дело????
Я ж ведь передал 19 байт информации 19 символов. Почему они не скопировались в строку?
Ведь char это ж символьный класс? Правильно символьный.
А буковка Ш - это символ? Конечно.
Ну так почему же она заняла строчка "Шлифов"+вопросик заняли 15 байт????
Хелп гаспада!!!
Помогите бедному студенту!!!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2013, 16:46     Запись русских символов в char
Посмотрите здесь:

Сравнение русских символов. C++
Ввод русских символов. C++
Запись в *char элемента из массива *char[i] C++
вывод на консоль русских символов C++
Запись строки char в массив char C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
v.a.l.i.d
 Аватар для v.a.l.i.d
412 / 377 / 10
Регистрация: 21.09.2012
Сообщений: 913
08.01.2013, 17:26     Запись русских символов в char #2
"Шлифовальный станок" не поместится в char name[15]; )

Добавлено через 6 минут
C++
1
2
3
    char name[15];
    cin.getline(name, 15, '\n');
    cout << name << endl;
У меня в Visul Studio вот что выводит:
Шлифовальный с
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
08.01.2013, 18:02  [ТС]     Запись русских символов в char #3
Цитата Сообщение от v.a.l.i.d Посмотреть сообщение
"Шлифовальный станок" не поместится в char name[15]; )

Добавлено через 6 минут
C++
1
2
3
    char name[15];
    cin.getline(name, 15, '\n');
    cout << name << endl;
У меня в Visul Studio вот что выводит:
Шлифовальный с
Да у тебя правильно выводит.
Знаю что не поместиться.
Ты наверно не понял в чом проблема.
Просто у меня выводит "Шлифов" и ромбик с вопросикм внутри. И все.
Ни так как у тебя. Если б так как у тебя у меня б вопросов не было.

Примерно догадываюсь вчом проблема в кодировки. Тока я вообще не пойму что такое кодировка.
И как она может влиять на появление крякозябров?
От если у меня в консоли стоит utf-8 кодировка то где должна быть не utf-8 чтобы у меня крякозябры отображались?
Где несоответствие кодировок?
Еще когда я вывожу русские символы cout <<"то все выводится нормально";
Когда читаю из консоли cin >>name; в name текст из консоли, а потом вывожу то можно сказать крякозябры.
(не строка из 14 символо выводится, а строка из 6 и крякозябр в конце).
g++ компилятор;
sos господа!
v.a.l.i.d
 Аватар для v.a.l.i.d
412 / 377 / 10
Регистрация: 21.09.2012
Сообщений: 913
08.01.2013, 18:21     Запись русских символов в char #4
У меня вот так сделано:
C++
1
2
3
4
5
6
7
8
9
#include "windows.h"
 
int main()
{
   SetConsoleCP(1251);  
   SetConsoleOutputCP(1251);
 
   ...
}
+ еще в консоле поставить Lucida Console

И русский шрифт хорошо отображается

Добавлено через 6 минут
шрифт Lucida Console
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
08.01.2013, 19:50  [ТС]     Запись русских символов в char #5
Цитата Сообщение от v.a.l.i.d Посмотреть сообщение
У меня вот так сделано:
C++
1
2
3
4
5
6
7
8
9
#include "windows.h"
 
int main()
{
   SetConsoleCP(1251);  
   SetConsoleOutputCP(1251);
 
   ...
}
+ еще в консоле поставить Lucida Console

И русский шрифт хорошо отображается

Добавлено через 6 минут
шрифт Lucida Console
Спасибо старина!
Сделал так как ты писал.
Но у меня не находит #include "windows.h" (ос не windows).
Ну а в консоли уже стоит шрифт Lucida console.
Я от смотрю на функции и тут от чо то думаю.
От если у меня cout <<"выводит нормально русские символы в консоль",
то что это значит?
Мб это значит что редактор создает нормальные символы которые консоль принимает???
(То есть кодировка символов в редакторе соответствует кодировке символов в консоле)
А когда я ввожу через консоль в исполняемый файл символы в кодировке консоли,
то что с ними происходит???
Мб мы их передаем в исполняемый файл который их считывает, а потом передает на консоль в
другой кодировке не соответствующей консоли????
SOS !!!
Кто может ответить на вопросы почему крякозябры вылазят.

П.С. щас попробую поменять кодировку в редакторе проверю подтвердятся ли мои предположения?!

Добавлено через 1 час 8 минут
Вообщем разобрался оказалась на консоль данные попадали в кодировке cp1251.
А в консоли кодировка была utf-8.
Помогло setlocale(LC_ALL, "ru_UA.UTF-8").
Впринципе все предположения которые мб подтвердились.
v.a.l.i.d
 Аватар для v.a.l.i.d
412 / 377 / 10
Регистрация: 21.09.2012
Сообщений: 913
08.01.2013, 19:53     Запись русских символов в char #6
ninja2, А где об этом можно почитать, про русские буквы в консоле?
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 17
08.01.2013, 20:00     Запись русских символов в char #7
В консоли просто по умолчанию кодировка cp866 - т.е OEM, а файле исходника cp1251 тобиш кириллический Ansi.

Можно кстати сначала запускать cmd - выполнять комаду chcp 1251 а потом запускать свою прогу.

Ну либо в своей проге выполнять

C++
1
system("chcp 1251");
Dmitriy_M
1294 / 1175 / 104
Регистрация: 20.03.2009
Сообщений: 4,210
Записей в блоге: 11
08.01.2013, 20:03     Запись русских символов в char #8
Цитата Сообщение от v.a.l.i.d Посмотреть сообщение
ninja2, А где об этом можно почитать, про русские буквы в консоле?
В справочнике по C++ locale

Добавлено через 27 секунд
Avazart, написано же не Windows
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 17
08.01.2013, 20:07     Запись русских символов в char #9
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Avazart, написано же не Windows
Ну собственно исходник как тогда в cp1251 кодировке оказался ?
Dmitriy_M
1294 / 1175 / 104
Регистрация: 20.03.2009
Сообщений: 4,210
Записей в блоге: 11
08.01.2013, 20:08     Запись русских символов в char #10
Единственная бяка когда пишешь переносимый код, это в том, что в Windows и Linux имена кодировок различаются.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
08.01.2013, 20:24  [ТС]     Запись русских символов в char #11
Да вообщем ошибся я ничо не заработало. Поспешил. Как было так и есть.
Нормально отображается русские символы просто кагда меняю кодировку консоли на cp1251,
а если в utf-8 то не отображаются????
(когда в консоли cp1251, то тогда русские символы в кодировке utf-8 крякозябры)
Мне надо чтобы кодировка консоли была utf-8 и нормально русские символы отображались.
Как поменять вывод на консоль чтобы не в cp1251, а в utf-8 ?????
setlocale(LC_ALL, "ru_UA.UTF-8"). Ничо не меняет.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 17
08.01.2013, 20:40     Запись русских символов в char #12
http://anvarichn.livejournal.com/43752.html

Собственно, а какая ОСь ?

Как я понимаю кодировка файла исходника должна совпадать с кодировкой установленной в консоли тогда будет все ок.

Ну а вообще лучше использовать wchar_t
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
08.01.2013, 21:59  [ТС]     Запись русских символов в char #13
Ось убунту.
Файл исходника в utf-8.
Консоль в utf-8.
если cout <<"Русские символы выводятся нормально"
если считываем через cin то в кодировке cp1251 (крякозябры).
И никак на вывод не могу повлиять.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 17
08.01.2013, 22:34     Запись русских символов в char #14
А
C++
1
std::wcout<<L"Русские символы выводятся нормально";
и
C++
1
2
std::wstring wstr;
std::wcin>> wstr
Не решают проблему ?

Добавлено через 1 минуту
Цитата Сообщение от ninja2 Посмотреть сообщение
если считываем через cin то в кодировке cp1251 (крякозябры).
Не понято как то, откуда cp1251 взялось...
Может стоит в свойствах терминала посмотреть ?
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
09.01.2013, 00:05  [ТС]     Запись русских символов в char #15
Цитата Сообщение от Avazart Посмотреть сообщение
А
C++
1
std::wcout<<L"Русские символы выводятся нормально";
и
C++
1
2
std::wstring wstr;
std::wcin>> wstr
Не решают проблему ?

Добавлено через 1 минуту

Не понято как то, откуда cp1251 взялось...
Может стоит в свойствах терминала посмотреть ?
До тех функций не дошол еще.

От когда сохраняю исходный файл в кодировке cp1251, и в терминале ставлю cp1251, то все норм работает.
Как вводит так и выводит так как положено.

Когда сохраняю исходный файл в кодировке utf-8, и в терминале ставлю unf_8,
то опять через cout <<"бла-бла-бла"; выводится нормально,
а через cin >> и вывод через cout << крякозябры.
Сохраняю исходный файл в KOI8R и терминал в KOI8R,
то опять же таже фигня через cout <<"бла-бла-бла"; нормально,
а через cin >> и вывод через cout << крякозябры.

Сохраняю исходник в unf-8 терминал в cp1251, то наоборот получается
при выводе через cout <<"бла бла бла" крякозябры,
а при вводе cin и выводе cout все норм.
Аналогично и при KOI8R - исходник cp1251 - терминал.

Видимо где то чото настроено так, что постоянно выводит cp1251 как не сохрани.
Баг какой то либо специально сделано.
(наверно специально сделали так - русифицировали хорошо терминал)2
Да и удобно файл сохранил в cp1251 и все работает как надо.
(хотелось бы конечно в utf-8, но видно не судьба )

П.С. Ладно и так времени много потратил на эту кодировку,
а мне ведь нужно быстрее с++ выучить буквально за две недели.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2013, 00:11     Запись русских символов в char
Еще ссылки по теме:

C++ Замена русских символов пробелами
C++ Корретное отображение русских символов
C++ Что означает такая запись char *smt=new char[1]?

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

Или воспользуйтесь поиском по форуму:
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 17
09.01.2013, 00:11     Запись русских символов в char #16
Могу сказать что странно... буду под Убунтой проверю...

Подозреваю что просто настройки где-то накрутил...
Yandex
Объявления
09.01.2013, 00:11     Запись русских символов в char
Ответ Создать тему
Опции темы

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