eve*_*veo 2 c newline input scanf
问题我输入y一个选项,它会在再次提示我之前打印文本两次,因为它应该只打印一次.
正确的输出(我应该得到但没有获得):
Do you order FISH (Y/N)? y
Fish choice (K- Haddock, T- Halibut)
Do you order FISH (Y/N)? y
Fish choice (K- Haddock, T- Halibut)
Do you order FISH (Y/N)? n
Do you order CHIPS (Y/N)? n
Do you order DRINKS (Y/N)? y
Drinks choice (S- Softdrink, C- Coffee, T- Tea)
Do you order DRINKS (Y/N)? n
Run Code Online (Sandbox Code Playgroud)
错误的输出(我得到的输出)
Do you order FISH (Y/N)? y
Fish choice (K- Haddock, T- Halibut)
Do you order FISH (Y/N)? Fish choice (K- Haddock, T- Halibut)
Do you order FISH (Y/N)? y
Fish choice (K- Haddock, T- Halibut)
Do you order FISH (Y/N)? Fish choice (K- Haddock, T- Halibut)
Do you order FISH (Y/N)? n
Do you order CHIPS (Y/N)? Chips choice (C- Cut, R- Ring)
Do you order CHIPS (Y/N)? n
Do you order DRINKS (Y/N)? Drinks choice (S- Softdrink, C- Coffee, T- Tea):
Do you order DRINKS (Y/N)? n
Run Code Online (Sandbox Code Playgroud)
RAW SOURCE(如果您想自己编译并查看最新信息):http://pastebin.com/raw.php?i = mZ1jVrF0
资源
#include <stdio.h>
#include <string.h>
int main() {
char fishYesNo, chipsYesNo, drinksYesNo;
char *typeOfFood;
do {
typeOfFood = "fish";
printf("Do you order FISH (Y/N)? ");
scanf("%c", &fishYesNo);
if (fishYesNo != 'n') {
printf("Fish choice (K- Haddock, T- Halibut) \n");
}
else if (fishYesNo == 'n') {
typeOfFood = "chips";
}
} while ((strcmp(typeOfFood, "fish")) == 0);
do {
typeOfFood = "chips";
printf("Do you order CHIPS (Y/N)? ");
scanf("%c", &chipsYesNo);
if (chipsYesNo != 'n') {
printf("Chips choice (C- Cut, R- Ring) \n");
}
else if (chipsYesNo == 'n') {
typeOfFood = "drinks";
}
} while ((strcmp(typeOfFood, "chips")) == 0);
do {
typeOfFood = "drinks";
printf("Do you order DRINKS (Y/N)? ");
scanf("%c", &drinksYesNo);
if (drinksYesNo != 'n') {
printf("Drinks choice (S- Softdrink, C- Coffee, T- Tea):\n");
}
else if (drinksYesNo == 'n') {
typeOfFood = "fish";
}
} while ((strcmp(typeOfFood, "drinks")) == 0);
}
Run Code Online (Sandbox Code Playgroud)
这是C中一个众所周知的概念错误.comp.lang.c FAQ(我建议你阅读)有很多关于这个和其他陷阱的信息.
解释你的代码中发生了什么(comp.lang.c FAQ列表·问题12.18b):
你想
scanf %c读一个单一的字符,但是当你尝试在它上面输入那个单个字符时,在输入系统的其余部分接受它之前,你也必须按下RETURN键.scanf只读一个字符,但是额外的换行符仍然位于某个输入缓冲区中,而这是你后来的输入调用接收到的额外换行符(看似代表虚线空白行).
如何处理它,从对scanf问题的回顾(comp.lang.c FAQ list·Question 12.20):
在使用时,几乎不可能优雅地处理所有这些潜在的问题
scanf; 读取整行(有fgets或类似)更容易 ,然后使用sscanf或其他技术解释它们.