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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
#1

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

08.01.2013, 16:46. Просмотров 2404. Ответов 15
Метки нет (Все метки)

Добрый день господа!!!
Мне нужно в поле 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 байт????
Хелп гаспада!!!
Помогите бедному студенту!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2013, 16:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Запись русских символов в char (C++):

Запись символов из файла в единичный char и строку - C++
Всем привет, учусь получать данные из файла и нашёл такое явление: если у нас есть такой код: ifstream gt(&quot;test.ini&quot;); char buff; ...

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

Что означает такая запись char *smt=new char[1]? - C++
что означает такая запись char *smt=new char?

Запись в *char элемента из массива *char[i] - C++
Есть динамический массив, например char *drives = {&quot;A:&quot;, &quot;B:&quot;, &quot;C:&quot;, &quot;D:&quot;, &quot;E:&quot;, &quot;F:&quot;, &quot;G:&quot;, &quot;H:&quot;, &quot;I:&quot;, &quot;J:&quot;, &quot;K:&quot;, &quot;L:&quot;,&quot;M:&quot;, &quot;N:&quot;,...

Запись строки char в массив char - C++
Глупый вопрос, но что поделать, многое забыл... Хочу записть строку типа char в массив строк типа char, но выдает ошибку что &quot;невозможно...

Сравнение русских символов. - C++
Проблема с русскими символами. Русские символы заносятся в массив занимая две ячейки( 2 байта ). Думаю это связано с UTF-8 кодировкой. ...

15
v.a.l.i.d
413 / 378 / 10
Регистрация: 21.09.2012
Сообщений: 913
08.01.2013, 17:26 #2
"Шлифовальный станок" не поместится в char name[15]; )

Добавлено через 6 минут
C++
1
2
3
    char name[15];
    cin.getline(name, 15, '\n');
    cout << name << endl;
У меня в Visul Studio вот что выводит:
Шлифовальный с
1
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
08.01.2013, 18:02  [ТС] #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 господа!
0
v.a.l.i.d
413 / 378 / 10
Регистрация: 21.09.2012
Сообщений: 913
08.01.2013, 18:21 #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
3
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
08.01.2013, 19:50  [ТС] #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").
Впринципе все предположения которые мб подтвердились.
1
v.a.l.i.d
413 / 378 / 10
Регистрация: 21.09.2012
Сообщений: 913
08.01.2013, 19:53 #6
ninja2, А где об этом можно почитать, про русские буквы в консоле?
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,046
Записей в блоге: 17
08.01.2013, 20:00 #7
В консоли просто по умолчанию кодировка cp866 - т.е OEM, а файле исходника cp1251 тобиш кириллический Ansi.

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

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

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

Добавлено через 27 секунд
Avazart, написано же не Windows
1
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,046
Записей в блоге: 17
08.01.2013, 20:07 #9
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Avazart, написано же не Windows
Ну собственно исходник как тогда в cp1251 кодировке оказался ?
0
Dmitriy_M
1360 / 1243 / 114
Регистрация: 20.03.2009
Сообщений: 4,449
Записей в блоге: 11
08.01.2013, 20:08 #10
Единственная бяка когда пишешь переносимый код, это в том, что в Windows и Linux имена кодировок различаются.
0
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
08.01.2013, 20:24  [ТС] #11
Да вообщем ошибся я ничо не заработало. Поспешил. Как было так и есть.
Нормально отображается русские символы просто кагда меняю кодировку консоли на cp1251,
а если в utf-8 то не отображаются????
(когда в консоли cp1251, то тогда русские символы в кодировке utf-8 крякозябры)
Мне надо чтобы кодировка консоли была utf-8 и нормально русские символы отображались.
Как поменять вывод на консоль чтобы не в cp1251, а в utf-8 ?????
setlocale(LC_ALL, "ru_UA.UTF-8"). Ничо не меняет.
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,046
Записей в блоге: 17
08.01.2013, 20:40 #12
http://anvarichn.livejournal.com/43752.html

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

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

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

Добавлено через 1 минуту
Цитата Сообщение от ninja2 Посмотреть сообщение
если считываем через cin то в кодировке cp1251 (крякозябры).
Не понято как то, откуда cp1251 взялось...
Может стоит в свойствах терминала посмотреть ?
1
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
09.01.2013, 00:05  [ТС] #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, но видно не судьба )

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

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

Вывод русских символов в консоль - C++
Чтобы выводить русские буквы в консоли, написал функцию rustext() #include&lt;iostream&gt; using namespace std; #include&lt;windows&gt; ...

Корретное отображение русских символов - C++
Здравствуйте, подскажите пожалуйста как моножно решить следующую проблемму: Написал программу, которая запрашивает и вывожит информацию....

Вывод в консоль русских символов - C++
Парни объясните почему так происходит?? почему не выводятся символы от а до р? ps : setlocal rus .... хз как там, уже пробовал добавлять...


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

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

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