Аналог getch
От: YourLastSong  
Дата: 07.05.11 12:53
Оценка:
Здравствуйте, господа.

Существует ли какой-нибудь аналог getch (), _getch () и getchar () без использования conio.h и не требующий нажатия какой-либо другой клавиши?

Заранее благодарю за возможные ответы.
Re: Аналог getch
От: LaptevVV Россия  
Дата: 07.05.11 12:59
Оценка:
Здравствуйте, YourLastSong, Вы писали:

YLS>Здравствуйте, господа.


YLS>Существует ли какой-нибудь аналог getch (), _getch () и getchar () без использования conio.h и не требующий нажатия какой-либо другой клавиши?

getchar() — это стандартная функция из stdio.h
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Аналог getch
От: YourLastSong  
Дата: 07.05.11 14:09
Оценка:
LVV>getchar() — это стандартная функция из stdio.h

Так ведь он требует нажатия ещё одной клавиши. Мне нужно, чтобы вводился только один символ.
Re[3]: Аналог getch
От: MasterZiv СССР  
Дата: 07.05.11 14:38
Оценка:
On 07.05.2011 18:09, YourLastSong wrote:

> Так ведь он требует нажатия ещё одной клавиши. Мне нужно, чтобы вводился только

> один символ.

Кто тебе это сказал ?
Posted via RSDN NNTP Server 2.1 beta
Re[4]: Аналог getch
От: YourLastSong  
Дата: 07.05.11 15:04
Оценка:
MZ>Кто тебе это сказал ?

Только что проверил в Visual Studio.

char c;
c = getchar ();

После чего я могу ввести сколько угодно символов, хотя надо, чтобы вводился только один при этом.
Re: Аналог getch
От: YourLastSong  
Дата: 07.05.11 15:23
Оценка:
Или хотя бы скажите, как сделать, чтобы getch () или _getch () работали с русскими буквами?
Re[2]: Аналог getch
От: const_volatile  
Дата: 07.05.11 16:00
Оценка:
Здравствуйте, YourLastSong, Вы писали:

YLS>Или хотя бы скажите, как сделать, чтобы getch () или _getch () работали с русскими буквами?


у меня всё работает (c). почему тебе кажется, что они не работают с русскими буквами?
Re[3]: Аналог getch
От: YourLastSong  
Дата: 07.05.11 16:47
Оценка:
bool flag5 = false;

wchar_t c;

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 только. Почему?
Re[3]: Аналог getch
От: YourLastSong  
Дата: 07.05.11 17:13
Оценка:
В общем, вместо данных символов он выводит другие.
Re[4]: Аналог getch
От: LaptevVV Россия  
Дата: 07.05.11 17:30
Оценка:
Здравствуйте, YourLastSong, Вы писали:

YLS>В общем, вместо данных символов он выводит другие.

А локаль поставить не пробовал?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[5]: Аналог getch
От: YourLastSong  
Дата: 07.05.11 17:51
Оценка:
LVV>А локаль поставить не пробовал?

Уже итак стоит.

std::wcout.imbue(std::locale("rus_rus.866"));
std::wcin.imbue(std::locale("rus_rus.866"));

Или вы про setlocale(LC_ALL,"Russian") сейчас?
Re[4]: Аналог getch
От: const_volatile  
Дата: 07.05.11 18:04
Оценка:
Здравствуйте, 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 тут тоже не поможет по этой же причине.
Re[5]: Аналог getch
От: YourLastSong  
Дата: 07.05.11 18:12
Оценка:
_>- либо использовать десятичные коды символов вместо прямого написания (0xa4 вместо 'д', например);

Можно узнать коды других символов, если не сложно? Хотя бы коды тех символов, что у меня здесь сейчас есть.

_>- либо переключить кодировку текущей консоли в приемлемую через winapi вызов SetConsoleCP.


Как именно это сделать?
Re[6]: Аналог getch
От: const_volatile  
Дата: 07.05.11 18:41
Оценка:
Здравствуйте, YourLastSong, Вы писали:

_>>- либо использовать десятичные коды символов вместо прямого написания (0xa4 вместо 'д', например);

YLS>Можно узнать коды других символов, если не сложно? Хотя бы коды тех символов, что у меня здесь сейчас есть.

http://lmgtfy.com/?q=cp866+character+codes&amp;l=1

_>>- либо переключить кодировку текущей консоли в приемлемую через winapi вызов SetConsoleCP.

YLS>Как именно это сделать?

int main ()
{
    SetConsoleCP (1251);
// ...
Re[7]: Аналог getch
От: YourLastSong  
Дата: 07.05.11 18:46
Оценка:
К сожалению, SetConsoleCP (1251); не помогает.
Re[6]: Аналог getch
От: LaptevVV Россия  
Дата: 07.05.11 18:56
Оценка:
Здравствуйте, 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(), насколько я помню, не отображает символ на экране.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[7]: Аналог getch
От: YourLastSong  
Дата: 07.05.11 19:00
Оценка:
А в случае использования кодов символов проблем не будет вообще?
Re[8]: Аналог getch
От: const_volatile  
Дата: 07.05.11 19:38
Оценка:
Здравствуйте, YourLastSong, Вы писали:

YLS>А в случае использования кодов символов проблем не будет вообще?


как правило нет, но есть тонкости с преобразованиями между char и int. по умолчанию char считается знаковым типом и, например значение 0xe4 после (явного или неявного) каста в int превратится в 0xffffffe4 (скорее всего поэтому у тебя опять не ловятся русские буквы после SetConsoleCP).
Re[9]: Аналог getch
От: YourLastSong  
Дата: 07.05.11 19:43
Оценка:
А с работой программы на других компьютерах проблем не возникнет в таком случае?
Re[10]: Аналог getch
От: const_volatile  
Дата: 07.05.11 19:54
Оценка:
Здравствуйте, YourLastSong, Вы писали:

YLS>А с работой программы на других компьютерах проблем не возникнет в таком случае?


"другие компьютеры" слишком растяжимое понятие но если исключить возможность того, что микрософт сломает backwards compatibility в рантайме msvs или в консольном i/o винды, то вобщем не вижу откуда тут взяться проблемам
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.