Scanf_s продолжает возвращать \0 вместо ввода
На мой взгляд, я застрял на довольно простой задаче. Я написал программу, которая выбирает случайное число и заставляет вас угадать, какое это число, и выходить из программы в конце, если введены символы "n" или "N". Код выглядит следующим образом:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int input_switcher(int input, int answer)
{
if (input == answer) {return 1;}
else if(input < answer) {return 2;}
else if(input > answer) {return 3;}
else {return 0;}
}
int main(void)
{
int input, answer, tries;
char keepGoing = 'J';
srand((int)time(0));
while(42)
{
input = 0, tries = 0;
answer = 1;//rand()%100+1;
printf("Jag \"t\x84nker\" p\x86 ett tal mellan 1 och 100, gissa vilket!\n");
while(42)
{
printf("Gissning: ");
scanf_s("%d", &input);
switch (input_switcher(input, answer))
{
case 1:
printf("Grattis, det var r\x84tt!\n");
printf("Du gjorde %d f\x94rs\x94k.", tries);
break;
case 2:
printf("Du gissade f\x94r l\x86gt, f\x94rs\x94k igen!\n");
tries++;
break;
case 3:
printf("Du gissade f\x94r h\x94gt, f\x94rs\x94k igen!\n");
tries++;
break;
default:
break;
}
if(input == answer) {break;}
}
printf("Ska vi spela en g\x86ng till(J/N)? ");
scanf_s("%*c%c", &keepGoing);
if(keepGoing == 'N' || keepGoing == 'n') {return 0;}
else if(keepGoing == 'J' || keepGoing == 'j') {system("cls");}
}
return 0;
}
Проблема у меня в том, что мой последний scanf_s
дает мне \0
вместо персонажа, который я ввожу. Я определил проблему или я не прав? Что я могу изменить, чтобы исправить эту проблему?
2 ответа
Твоя последняя scanf_s
получает \n
и не \0
, Съесть это \n
менять
printf("Ska vi spela en g\x86ng till(J/N)? ");
scanf_s("%*c%c", &keepGoing);
в
printf("Ska vi spela en g\x86ng till(J/N)? ");
scanf_s(" %c", &keepGoing);
^
|
space before %c specifier
Это работает.
Вывод: на Win7 с GCC 4.7.1
scanf()
Достаточно в этом вместо scanf_s
==>
Вы можете изменить scanf
в двух местах
Как это:
scanf("%d", &input);
scanf(" %c", &keepGoing);
^ //use space here , to consume the leftover \n from previous scanf entry
И если вы все еще сталкиваетесь с проблемой Вы можете использовать fflush(stdin);
позапрошлый scanf_s()
В Windows это будет работать.
fflush(stdin);
scanf("%c", &keepGoing);