Добрый день. Задавал этот вопрос уже 2 знакомым и ещё на одном форуме. Народ предлагает свои варианты, но мою ошибку исправить не могут. Пишу проблему:
Почему-то С++ отказывается выводить на экран русские буквы: вместо них бессмысленный набор символов. Я решил написать заголовочный файл и поместить в него функцию, с помощью которой можно нормально выводить русский текст. Вызывать захотел её вот так:
write_rus("Привет мир!");
Создал заголовочный файл write_rus.h и описал в нём эту функцию. Привожу код:
// write_rus - функция для вывода на
// экран русскими буквами
void write_rus (char *string)
{
char x;
while (*string != '\0')
{
switch (*string)
{
case 'А':
{
x=128;
std::cout<<x;
}
break;
case 'Б':
{
x=129;
std::cout<<x;
}
break;
/***************************************/
case 'ю':
{
x=238;
std::cout<<x;
}
break;
case 'я':
{
x=239;
std::cout<<x;
}
break;
default: std::cout << *string; break; // для символов и для английских букв
}
string++; // сдвигаем указатель на следующий символ
}
}
Кусок кода, помеченный символом /***************************************/ я удалил чтобы не загромождать здесь. Суть здесь такая: я передаю в функцию строку символов. Затем с помощью указателя просматриваю её до конца (до символа '\0') и для каждого символа вывожу на экран переменную x. Чему должна быть равна эта переменная я просто тупо подобрал. Таким образом я перебрал весь русский алфавит от А до Я и ещё раз от а до я. Если в строке английская буква или символ, то просто её вывожу (строчка с default).
Мне показалось, что вроде всё правильно. Я написал файл .cpp и подключил туда свой заголовочный файл с функцией. Решил проверить. Привожу код:
#include <iostream>
#include "write_rus.h" // чтобы ипользовать функцию write_rus()
int main()
{
using std::cout;
using std::endl;
write_rus("AБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"); // русские буквы
cout<<endl;
write_rus("абвгдеёжзийклмнопрстуфхцчшщъыьэюя"); // русские буквы
cout<<endl;
write_rus("ABCDEFGHILKLMNOPQRSTUVWXYZ"); // английские буквы тоже выводит
cout<<endl;
write_rus("abcdefghijklmnopqrstuvwxyz"); // английские буквы тоже выводит
cout<<endl;
cout<<"ABCDEFGHILKLMNOPQRSTUVWXYZ"<<endl; // этот способ только для английских букв
cout<<"abcdefghijklmnopqrstuvwxyz"<<endl<<endl; // этот способ только для английских букв
char response; // эти 2 строчки для
std::cin >> response; // задержки экрана
return 0;
}
Нажал на компиляцию. Выдало одно предупреждение много раз:
warning C4309: =: усечение константного значения
Весь текст из окошка Вывод:
1>Построение начато 09.08.2012 22:00:46.
1>ClCompile:
1> write_rus.cpp
1>d:\my documents\write_rus\write_rus\write_rus.h(12): warning C4309: =: усечение константного значения
1>d:\my documents\write_rus\write_rus\write_rus.h(18): warning C4309: =: усечение константного значения
.
. (аналогично, пропустил)
.
1>d:\my documents\write_rus\write_rus\write_rus.h(396): warning C4309: =: усечение константного значения
1>d:\my documents\write_rus\write_rus\write_rus.h(402): warning C4309: =: усечение константного значения
1>
1>Построение успешно завершено.
1>
1>Затраченное время: 00:00:00.85
========== Построение: успешно: 1, с ошибками: 0, без изменений: 0, пропущено: 0 ==========
То есть он в качестве предупреждения помечает те строчки, в которых я присваиваю переменной х значения ( и того 33*2= 66 предупреждений). Причём программа запускается и всё работает, так как это не ошибка, а только предупреждение.
Сейчас прочитал в учебнике совет, что всё таки предупреждения надо исправлять. Но я не знаю где тут ошибка. Подскажите, кто разбирается.