You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 13:27:21