scanf在C中运行不正常

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; } 

有人帮助我理解我的问题,因为我从这段代码得到的输出是“你想退出y \ n?” getchar ……“对不起,你想要退出y \ n?”

它看起来像是第一次跳过scanf()并且程序直接转到了else ==> "sorry i didnt get that"并且只在第二次它完成了如何使用scanf()

scanf()%c读取字符,是的,按[ ENTER键] [在你之前的输入之后]对%c来说非常有用[检查下面的剧透]。

按ENTER键==换行符

使用

 scanf(" %c", &YN); //mind the space brefore `%c` ^ | 

忽略任何以前存储的[也是,前导]空格[包括换行符]。

注意:这也消除了你的getch();

scanf读取任何内容时,它会在输入缓冲区中通过Enter添加换行符。 "%c"格式读取输入缓冲区中的任何字符,包括换行符。 因此,第一个调用将从输入缓冲区中读取并提取一个字符,但下一个调用将读取前一个调用中遗留的换行符。

向格式字符串添加前导空格告诉scanf在尝试解析和提取格式之前读取(并忽略)任何空格(空格,制表符,换行符)。

我建议您阅读例如此scanf参考以获取更多信息。

删除getch()你基本上做了两次相同的事情。

%c之前添加一个空格,以便跳过第一次输入scanf数据后按下的stdin的换行符。 发生这种情况是因为scanf不会消耗输入任何字符后按下的\n字符(Enter键)。由于Enter键( \n )也是一个字符,它会被scanf第二次消耗,因此不会等待进一步的输入。

另外,使用goto通常是不好的做法。 有关详细信息,请参阅此处。