if (a % 5)
goto ask;
else
goto main;
ask:printf("Do You Want To Exit ? Y \\ N . . . \n");
scanf("%c", &YN);
getch();
if (YN == 'Y')
{
y: system("cls");
YN = 1;
goto sign;
}
else if (YN == 'y')
goto y;
else if (YN == 'N')
{
n: system("cls");
YN = 0;
goto sign;
}
else if (YN == 'n')
{
goto n;
}
else
{
printf("Sorry ..Didn't Catch that ... ");
goto ask;
}
有人帮我理解我的问题
对于某些原因,我从这段代码得到的输出是
"你想退出你吗?"
getchar ...
"抱歉没有抓到你想退出y \ n? "
它似乎第一次跳过scanf()
,程序直接转到else
==> "sorry i didnt get that"
并且只是在第二次它阐明了如何使用scanf()
。
答案 0 :(得分:1)
scanf()
使用%c
读取字符,是的, ENTER 键按下[在您之前的输入之后]对于%c
来说非常有用[请查看下面的内容]扰流板。
按ENTER键==换行符
使用
scanf(" %c", &YN); //mind the space brefore `%c`
^
|
忽略任何以前存储的[也是,前导]空格[包括换行符。]
注意:这也消除了对getch();
答案 1 :(得分:1)
当scanf
读取任何内容时,它会在输入缓冲区中通过 Enter 添加换行符。 "%c"
格式读取输入缓冲区中的任何字符,包括换行符。因此,第一个调用将从输入缓冲区中读取并提取一个字符,但下一个调用将读取前一个调用中遗留的换行符。
在格式字符串中添加前导空格会让scanf
在尝试解析和提取格式之前读取(并忽略)任何空格(空格,制表符,换行符)。
我建议你阅读,例如this scanf
reference了解更多信息。
答案 2 :(得分:0)
在%c
之前添加空格,以便在首次输入stdin
的数据后跳过您按下的scanf
中的换行符。发生这种情况是因为scanf
不会消耗您在输入任何字符后按下的\n
字符(Enter键)。由于Enter键(\n
)也是一个字符,它会被消耗由scanf
第二次,因此不等待进一步的输入。
此外,使用goto
通常是不好的做法。有关详细信息,请参阅this。
答案 3 :(得分:0)
删除getch()
你基本上做了两次同样的事情。