如何在C语言中用单个scanf()读取一行不定数量(最多50个)的输入
问题:如何读取一行不定数量数字并通过^D结束输入
我需要实现一个程序,接收一行中不定数量(最多50个)的数字输入,输入输出示例如下:
输入示例:
Enter Numbers: 20 15 5 8 16 12 ^D
输出示例:
20 | ******************** 15 | *************** 5 | ***** 8 | ******** 16 | **************** 12 | ************
目前我的代码要求用户每个输入值之间按回车键,不知道如何实现上述输入方式,也不清楚怎么处理用^D结束输入的逻辑。当前代码如下:
#include <stdio.h> #define MAX_SIZE 50 int main (){ printf("Enter numbers: "); for(int i = 0; i <= MAX_SIZE; i++) { int a; scanf("%d", &a); } return 0; }
解决方案关键点
1. scanf本身支持空白符分隔输入
scanf("%d")会自动跳过所有空白字符(包括空格、回车、制表符),你的代码其实已经可以接收一行内的多个数字,不需要每个数字按回车——问题出在循环条件和EOF处理上。
2. 处理^D触发的EOF结束输入
当用户在终端按下D(Unix/Linux/macOS)或Z(Windows)时,scanf会返回EOF(值为-1的宏),我们可以通过检查这个返回值来终止输入循环。
修改后的代码示例
#include <stdio.h> #define MAX_SIZE 50 int main() { int numbers[MAX_SIZE]; int count = 0; printf("Enter Numbers: "); // 循环读取,直到达到最大数量或遇到EOF while (count < MAX_SIZE) { int read_result = scanf("%d", &numbers[count]); // 遇到EOF或读取失败(比如输入非数字)则终止 if (read_result == EOF || read_result != 1) { break; } count++; } // 示例输出逻辑(你可根据需求调整) for (int i = 0; i < count; i++) { // 格式化数字为3位宽度,对齐输出 printf("%3d | ", numbers[i]); for (int j = 0; j < numbers[i]; j++) { printf("*"); } printf("\n"); } return 0; }
关键逻辑说明
- 循环条件
count < MAX_SIZE确保最多读取50个数字,避免数组越界。 - 检查
scanf的返回值:返回1表示成功读取一个整数;返回EOF表示用户触发了输入结束;返回0表示输入了非数字字符,此时也终止输入。 - 在终端中输入完所有数字后,直接按下^D即可结束输入,程序会开始处理读取到的数字。
内容的提问来源于stack exchange,提问作者Andre King
相关产品推荐
相关产品推荐

