如何在含scanf_s的项目中用scanf实现按回车退出程序?
问题原因
你的代码在包含scanf_s的项目里失效,核心原因是输入缓冲区残留:scanf_s读取用户输入后,你按下的回车键对应的'\n'会留在标准输入缓冲区中。后续调用fgetc(stdin)时,直接读取到了缓冲区里的残留换行符,不会等待用户新的输入,所以看起来没触发输入提示。
用scanf/scanf_s实现按回车退出的方案
以下是几种可行的实现方式,适配带有scanf_s的项目场景:
方案1:先清理缓冲区,再用scanf_s捕获回车
先清空scanf_s留下的缓冲区残留,再等待用户按下回车:
#include <stdio.h> int main() { // 示例:项目中已有的scanf_s代码 int input_num; scanf_s("%d", &input_num); // 跨平台清理输入缓冲区(替代fflush(stdin),避免未定义行为) int temp_ch; while ((temp_ch = getchar()) != '\n' && temp_ch != EOF) { // 跳过缓冲区中所有残留字符 } char ch; // 等待用户按下回车键 while (scanf_s("%c", &ch, 1) == 1 && ch != '\n') { // 跳过用户可能输入的其他字符,直到捕获到回车 } printf("\n程序退出\n"); return 0; }
方案2:用scanf格式串直接匹配回车
通过scanf的格式控制,自动跳过非换行字符并捕获回车,无需额外清理:
#include <stdio.h> int main() { // 示例:项目中已有的scanf_s代码 float input_float; scanf_s("%f", &input_float); // 等待用户按下回车键:先跳过所有非换行字符,再读取换行符 scanf("%*[^\n]"); // %*表示读取但不存储,[^\n]匹配所有非换行字符 scanf("%*c"); // 读取并丢弃换行符 printf("\n程序退出\n"); return 0; }
关键说明
- 避免使用
fflush(stdin):该操作是微软编译器的非标准扩展,在其他平台(如Linux)属于未定义行为,跨平台场景建议用循环读取的方式清理缓冲区。 - 如果你的场景中不需要处理用户可能输入的其他字符,也可以简化为直接调用
getchar(),但前提是确保缓冲区已被清空。
内容的提问来源于stack exchange,提问作者qinder
相关产品推荐
相关产品推荐

