Здравствуйте, YourLastSong, Вы писали:
YLS>Здравствуйте, господа.
YLS>Существует ли какой-нибудь аналог getch (), _getch () и getchar () без использования conio.h и не требующий нажатия какой-либо другой клавиши?
getchar() — это стандартная функция из stdio.h
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
while(!flag5)
{
std::wcout << std::endl << L"Нажмите одну из клавиш — y/n/д/н ";
c = _getch ();
switch (c)
{
case L'н':
case 'n':
flag5 = true;
break;
case L'д':
case 'y':
flag5 = true;
break;
default:
std::wcout << std::endl << L"Вы должны ввести один из данных символов — y/n/д/н" << std::endl;
}
}
При попытке ввести русский символ, постоянно выполняется default только. Почему?
Здравствуйте, YourLastSong, Вы писали:
YLS>wchar_t c;
_getch() возвращает char, скастованный в int. это не wchar_t.
YLS> while(!flag5) YLS> { YLS> std::wcout << std::endl << L"Нажмите одну из клавиш — y/n/д/н "; YLS> c = _getch (); YLS> switch (c) YLS> { YLS> case L'н': YLS> case 'n': YLS> flag5 = true; YLS> break; YLS> case L'д': YLS> case 'y': YLS> flag5 = true; YLS> break; YLS> default: YLS> std::wcout << std::endl << L"Вы должны ввести один из данных символов — y/n/д/н" << std::endl; YLS> } YLS> }
YLS>При попытке ввести русский символ, постоянно выполняется default только. Почему?
потому что _getch() возвращает символы в текущей кодировке консоли (по умолчанию OEM, в русской винде это cp866), а этот исходный файл сохранён в какой-то другой (cp1251 или UTF-8?). чтобы добиться того что ты хочешь, надо
— либо сохранять файл в досовской кодировке;
— либо использовать десятичные коды символов вместо прямого написания (0xa4 вместо 'д', например);
— либо переключить кодировку текущей консоли в приемлемую через winapi вызов SetConsoleCP.
изменением локали потока wcin тут не обойдёшься, потому что _getch — низкоуровневый вызов и работает перпендикулярно c++ потокам. и, кстати, setlocale тут тоже не поможет по этой же причине.
_>- либо использовать десятичные коды символов вместо прямого написания (0xa4 вместо 'д', например);
Можно узнать коды других символов, если не сложно? Хотя бы коды тех символов, что у меня здесь сейчас есть.
_>- либо переключить кодировку текущей консоли в приемлемую через winapi вызов SetConsoleCP.
Здравствуйте, YourLastSong, Вы писали:
_>>- либо использовать десятичные коды символов вместо прямого написания (0xa4 вместо 'д', например); YLS>Можно узнать коды других символов, если не сложно? Хотя бы коды тех символов, что у меня здесь сейчас есть.
Здравствуйте, YourLastSong, Вы писали:
LVV>>А локаль поставить не пробовал?
YLS>Уже итак стоит.
YLS>std::wcout.imbue(std::locale("rus_rus.866")); YLS>std::wcin.imbue(std::locale("rus_rus.866"));
Это локали потоков. А getch() читает не из потока. YLS>Или вы про setlocale(LC_ALL,"Russian") сейчас?
Возможно, она поможет.
Я просто никогда getch() не использовал, поэтому не заморачивался.
Кстати, возможно ты просто выводишь не в той кодировке... getch(), насколько я помню, не отображает символ на экране.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, YourLastSong, Вы писали:
YLS>А в случае использования кодов символов проблем не будет вообще?
как правило нет, но есть тонкости с преобразованиями между char и int. по умолчанию char считается знаковым типом и, например значение 0xe4 после (явного или неявного) каста в int превратится в 0xffffffe4 (скорее всего поэтому у тебя опять не ловятся русские буквы после SetConsoleCP).
Здравствуйте, YourLastSong, Вы писали:
YLS>А с работой программы на других компьютерах проблем не возникнет в таком случае?
"другие компьютеры" слишком растяжимое понятие но если исключить возможность того, что микрософт сломает backwards compatibility в рантайме msvs или в консольном i/o винды, то вобщем не вижу откуда тут взяться проблемам