在C中重复循环

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)

Mat*_*ert 6

这是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或其他技术解释它们.