C语言如何使用scanf一次性读取1到3个不确定数量的整数
问题根源
你原本的写法问题在于scanf的%d格式符会自动跳过所有空白符(包括空格、换行、制表符等),如果用户只输入1或2个整数就敲回车,scanf会一直阻塞等待后续输入,直到凑够3个整数,所以没法适配可变数量的输入场景。
解决方法
核心思路
先读取用户输入的一整行内容(用户敲回车就结束输入,不会阻塞),再从该行内容中解析整数,通过解析成功的数量判断用户实际输入了多少个整数。
示例代码
#include <stdio.h> #include <string.h> int main() { int num_1, num_2, num_3; char input_buf[256]; // 定义缓冲区存储整行输入,长度可根据需求调整 int input_count; printf("Enter input: "); // 读取整行输入,避免scanf阻塞等待后续输入 if (fgets(input_buf, sizeof(input_buf), stdin) == NULL) { // 处理读取失败的情况 return 1; } // 从缓冲区中解析整数,返回值为成功解析的整数个数 input_count = sscanf(input_buf, "%d %d %d", &num_1, &num_2, &num_3); // 根据实际输入的整数个数处理逻辑 switch(input_count) { case 1: printf("你输入了1个整数:%d\n", num_1); // 此处添加1个整数的业务逻辑 break; case 2: printf("你输入了2个整数:%d %d\n", num_1, num_2); // 此处添加2个整数的业务逻辑 break; case 3: printf("你输入了3个整数:%d %d %d\n", num_1, num_2, num_3); // 此处添加3个整数的业务逻辑 break; default: printf("输入不合法,请输入1-3个整数\n"); } return 0; }
方案说明
fgets会读取用户输入的整行内容,遇到回车就结束,不会像scanf一样持续等待输入,完美适配用户输入1/2/3个整数后就结束输入的场景sscanf的返回值就是成功解析到的整数数量,你可以根据这个返回值走对应的业务逻辑- 缓冲区长度建议设置足够大,避免用户输入过长导致截断问题,如果有超长输入的处理需求,可以额外加判断逻辑处理缓冲区未读完的情况
内容的提问来源于stack exchange,提问作者abacus256
相关产品推荐
相关产品推荐

