意外调用printf

这是我在这里发布的关于C编程的第一个问题,因为我刚刚在几周前开始学习C语言。 生病写下我的代码,问我的问题是什么:)如果有人请知道我如何解决我的错误或我应该替换我的代码,请回复:)!

我遇到的问题是,如果你自己运行代码,你会看到一切正常,除了声明中的’else’部分。 我遇到的问题是,当有人输入多个字母时,它会多次运行最后一个printf语句,并且会在用户输入除y或n之外的字符时多次printf

第一部分有Y或N工作正常,但如果他们输入任意数量的其他字符,它不会只是说“请再次选择”,一次然后再重新扫描,它输出至少2个printfs,仅用于即使输入了一个字符,“请再次选择”“请再次选择”,然后,如果您为答案键入更多字符,则只需输入更多“请再次选择”。

请帮助我理解我做错了什么,因为我非常热衷于学习正确编程,但我只是被困在这里atm 🙂

 #include  #include  int main() { char answer; int loop = 0; printf("Please select. [Y/N]:\n"); while (loop == 0) { scanf("%c", &answer); if (answer == 'y' || answer == 'Y') { printf("Seeyou Later Aligator.\n"); break; return 0; } else if (answer == 'n' || answer == 'N') { printf("Mmkay.\n"); break; return 0; } else { printf("Please select again [Y/N]:\n"); loop = 0; } } getch(); return 0; } 

许多人指出的原因是你的scanf在用户按下ENTER后读取输入缓冲区中剩余的额外换行符。 所以这里有一种替代方法来读取输入以避免整个混乱:

 #include  #include  #include  int main() { char answer; printf("Please select. [Y/N]:\n"); while (1) { scanf("%1s%*[^\n]", &answer); answer |= 0x20; if (answer == 'y') { puts("Seeyou Later Aligator."); break; } else if (answer == 'n') { puts("Mmkay."); break; } else { puts("Please select again [Y/N]:"); } } getchar(); return 0; } 

这将只读取stdin上找到的第一个字符,并在此之后忽略其他所有字符,同时清除换行符的输入缓冲区

scanf每次读取所需的字符数。 如果有更多字符,则不会被忽略。 下次调用scanf时会读取它们。 因此,您会看到每个角色的多个打印件。 为了显式忽略挂起的输入,请在scanf之后调用fflush(stdin) 。 这意味着清除标准输入流中的任何数据。

更新: fflush不应用于输入流,如评论中所述。 使用接受的解决方案忽略输出。 但是我建议使用touppertolower而不是bit hack。

  1. 打破; 足够……返回永远不会被执行,因为你会突破
  2. 它的打印不止一次,因为scanf接收’\ n’和前一个输入的额外输入
  3. 在您的代码中,变量循环也毫无意义

这是固定代码:

 #include  #include  #include  int main() { char answer; int loop = 0; printf("Please select. [Y/N]:\n"); while (1) { scanf("%c", &answer); if (answer == 'y' || answer == 'Y') { printf("Seeyou Later Aligator.\n"); break; //return 0; } else if (answer == 'n' || answer == 'N') { printf("Mmkay.\n"); break; // return 0; } else { printf("Please select again [Y/N]:\n"); while(getchar()!='\n'){ getchar(); if(getchar() == '\n'){ break; } } } } getchar(); return 0; } 

输出:

 $ ./test Please select. [Y/N]: dddd Please select again [Y/N]: ffffff Please select again [Y/N]: y Seeyou Later Aligator.