在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);

}