在C中循环重复时执行
问题我键入在C中循环重复时执行,c,input,newline,scanf,C,Input,Newline,Scanf,问题我键入y作为一个选项,它会打印两次文本,然后在应该只打印一次时再次提示我 正确输出(我应该得到但没有得到的): 输出错误(我得到的输出) 原始源代码(如果您想自己编译并检查结果): 来源 #include <stdio.h> #include <string.h> int main() { char fishYesNo, chipsYesNo, drinksYesNo; char *typeOfFood; do { typ
y
作为一个选项,它会打印两次文本,然后在应该只打印一次时再次提示我
正确输出(我应该得到但没有得到的):
输出错误(我得到的输出)
原始源代码(如果您想自己编译并检查结果):
来源
#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);
}
#包括
#包括
int main(){
炭鱼、薯片、饮料;
焦*类食品;
做{
typeOfFood=“鱼”;
printf(“您是否订购鱼(是/否)”;
scanf(“%c”和“fishYesNo”);
如果(fishYesNo!=“n”){
printf(“鱼类选择(K-黑线鳕,T-大比目鱼)\n”);
}
else if(fishYesNo=='n'){
typeOfFood=“chips”;
}
}而(strcmp(鱼类))=0 ;;
做{
typeOfFood=“chips”;
printf(“您是否订购芯片?”;
scanf(“%c”和chipsysno);
如果(芯片编号!=“n”){
printf(“切屑选择(C-切割,R-环)\n”);
}
否则如果(芯片编号=='n'){
type of food=“饮料”;
}
}而(strcmp(chips))=0 ;;
做{
type of food=“饮料”;
printf(“您点饮料了吗?”);
scanf(“%c”、&drinksYesNo);
if(drinksYesNo!=“n”){
printf(“饮料选择(S-软饮料、C-咖啡、T-茶):\n”);
}
else if(drinksYesNo=='n'){
typeOfFood=“鱼”;
}
}而(strcmp(食物,饮品))=0 ;;
}
这是C语言中一个众所周知的概念错误。The(我建议您阅读)有很多关于这个和其他问题的信息
解释代码()中发生了什么:
您希望scanf%c
读取单个字符,但它试图读取,但是
当你试图在它上面输入一个字符时
输入系统会接受它,您也必须按RETURN
键。
scanf
只读取一个字符,但额外的换行符仍然存在
坐在输入缓冲区的某个地方,就是那个额外的换行符
(似乎代表虚幻的空行)收到
您稍后的输入呼叫
如何处理它,从对scanf的问题()的回顾来看:
要优雅地处理所有这些潜力几乎是不可能的
使用scanf时出现的问题;阅读整行文字要容易得多(使用
fgets
等),然后使用sscanf
或一些
其他技术
您正在扫描单个字符,但在输入字符后必须按enter键,因此在Y或N后面有一个新行字符。您将在第二次读取该字符。使用
“%c”
而不是“%c”
修复该问题。谢谢我怎样才能把你标记为正确答案呢?我已经看了一百万遍了,但我找不到重复的答案。我只看了两次,但这足以让我不重复它。更多关于scanf
问题的评论可以通过进入网站:stackoverflow.com scanf chris lutz
找到
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
#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);
}