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
通常是不好的做法。 有关详细信息,请参阅此处。