意外调用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
不应用于输入流,如评论中所述。 使用接受的解决方案忽略输出。 但是我建议使用toupper
或tolower
而不是bit hack。
- 打破; 足够……返回永远不会被执行,因为你会突破
- 它的打印不止一次,因为scanf接收’\ n’和前一个输入的额外输入
- 在您的代码中,变量循环也毫无意义
这是固定代码:
#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.