Не работает scanf в консольном окне
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 18.10.22 13:05
Оценка:
Я работаю в Qt Creator 4.12.2 .
В моём диалоговом интерфейсном приложении я открыл консольное окно (средствами WinAPI, так как сделать это средствами Qt я не знаю):

::AllocConsole();
freopen("CONIN$","rt",stdin);
freopen("CONIN$","wt",stdout);
freopen("CONIN$","wt",stderr);
HANDLE  hStdin, hStdout, hStderr;
hStdin = GetStdHandle(STD_INPUT_HANDLE);
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
hStderr = GetStdHandle(STD_ERROR_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO  csbiInfo;
GetConsoleScreeenBufferInfo(hStdout,&csbiInfo);
COORD  dwSize = csbiInfo.dwSize;
dwSize.Y = 9999;
SetConsoleScreenBufferSize(hStdin,dwSize);
SetConsoleScreenBufferSize(hStdout,dwSize);
SetConsoleScreenBufferSize(hStderr,dwSize);


В этом консольном окне осуществляется ввод-вывод текстовой информации.
И вот у меня код для ввода-вывода текстовой информации:

char  answer[2], alphaisequal[80];

sprintf(alphaisequal,"Коэффициент сходимости alpha равен %.5f . Хотите изменить (y/n)?\n\n",alphacoef);
printf("%s",alphaisequal);
printf(" ");
scanf("%s",answer);


Вывод текста работает, но вот почему-то не работает функция scanf — программа просто переходит дальше, не ожидая ввода этого значения.
Как исправить эту ошибку?
1613 г. = 2024 г.
Отредактировано 19.10.2022 6:38 RussianFellow . Предыдущая версия .
Re: Не работает scanf в консольном окне
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 19.10.22 06:39
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>Я работаю в Qt Creator 4.12.2 .

RF>В моём диалоговом интерфейсном приложении я открыл консольное окно (средствами WinAPI, так как сделать это средствами Qt я не знаю):

RF>
RF>::AllocConsole();
RF>freopen("CONIN$","rt",stdin);
RF>freopen("CONIN$","wt",stdout);
RF>freopen("CONIN$","wt",stderr);
RF>HANDLE  hStdin, hStdout, hStderr;
RF>hStdin = GetStdHandle(STD_INPUT_HANDLE);
RF>hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
RF>hStderr = GetStdHandle(STD_ERROR_HANDLE);
RF>CONSOLE_SCREEN_BUFFER_INFO  csbiInfo;
RF>GetConsoleScreeenBufferInfo(hStdout,&csbiInfo);
RF>COORD  dwSize = csbiInfo.dwSize;
RF>dwSize.Y = 9999;
RF>SetConsoleScreenBufferSize(hStdin,dwSize);
RF>SetConsoleScreenBufferSize(hStdout,dwSize);
RF>SetConsoleScreenBufferSize(hStderr,dwSize);
RF>


RF>В этом консольном окне осуществляется ввод-вывод текстовой информации.

RF>И вот у меня код для ввода-вывода текстовой информации:

RF>
RF>char  answer[2], alphaisequal[80];

RF>sprintf(alphaisequal,"Коэффициент сходимости alpha равен %.5f . Хотите изменить (y/n)?\n\n",alphacoef);
RF>printf("%s",alphaisequal);
RF>printf(" ");
RF>scanf("%s",answer);
RF>


RF>Вывод текста работает, но вот почему-то не работает функция scanf — программа просто переходит дальше, не ожидая ввода этого значения.

RF>Как исправить эту ошибку?
1613 г. = 2024 г.
Re[2]: Не работает scanf в консольном окне
От: Нomunculus Россия  
Дата: 19.10.22 06:44
Оценка: +2 :)
Здравствуйте, RussianFellow, Вы писали:

Никто не ответил — решил в топ поднять? Уж настолько разучился сам ответы искать?
Re: Не работает scanf в консольном окне
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 20.10.22 14:10
Оценка:
Вместо scanf я решил использовать ReadConsole. Я написал:

TCHAR  wanswer[4];
char  answer[10];
DWORD  dwCount = 3;

//...

ReadConsole(hStdin,wanswer,wcslen(wanswer),&dwCount,NULL);
length = WideCHarToMultiByte(CP_ACP,0,wanswer,-1,0,0,0,0);
WideCharToMultiByte(CP_ACP,0,wanswer,-1,answer,length,0,0);


Строка считывается. Но там, где стоит ReadConsole, в консольном окне я ввожу n и нажимаю ввод (то есть у меня получается строка "n\n"). В результате чего в переменной answer после выполнения функции WideCharToMultiByte у меня не "n\n", а какая-то ерунда.

В чём причина этого? Как исправить эту ошибку?
1613 г. = 2024 г.
Re: Не работает scanf в консольном окне
От: pilgrim_ Россия  
Дата: 20.10.22 15:30
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>Вывод текста работает, но вот почему-то не работает функция scanf — программа просто переходит дальше, не ожидая ввода этого значения.

RF>Как исправить эту ошибку?

RF>freopen("CONIN$","wt",stdout);
RF>freopen("CONIN$","wt",stderr);


Замени CONIN$ на CONOUT$
Re: Не работает scanf в консольном окне
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 25.10.22 07:06
Оценка:
Я сделал следующим образом:

HANDLE  hStdin = CreateFileW(GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,nullptr,OPEN_EXISTING,0,nullptr);
DWORD  oldMode;
GetConsoleMode(hStdin,&oldMode);
SetConsoleMode(hStdin,oldMode|ENABLE_LINE_INPUT|ENABLE_ECHO_INPUT);
//...
ReadConsoleW(hStdin,wanswer,sizeof(wanswer),&dwCount,NULL);
auto  sz = WideCharToMultiByte(CP_ACP,0,wanswer,dwCount,answer,sz,0,0);
answer[sz-2] = '\0';


В результате чтение данных из консольного окна работает.
1613 г. = 2024 г.
Re: Как отображать русский текст в консольном окне?
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 25.10.22 07:09
Оценка:
Чтение данных из консольного окна у меня работает.

Но как правильно выводить русский текст в консольном окне? А то я вывожу русский текст с помощью обычной функцией printf — и в результате чего у меня в консольном окне выводится абракадабра (при этом числа и латинский текст выводится нормально). Как исправить эту ошибку?
1613 г. = 2024 г.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.