You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过一次scanf调用实现整型数组的批量输入?

关于一次性用scanf给整型数组输入的问题

嘿,这个问题问得很实际!咱们来把它拆成两部分说清楚:

1. 能不能通过一次scanf调用实现整型数组的批量输入?

答案是分情况

  • 如果你提前知道要输入的整数个数,那完全可以用一次scanf调用搞定。因为scanf在处理%d格式符时,会自动跳过所有空白字符(空格、换行、制表符都算),所以不管用户用空格还是换行分隔数字,它都能正确解析。举个例子,要给长度为5的数组输入:
    int arr[5];
    // 一次调用,读取5个整数,用户怎么用空白分隔都行
    scanf("%d %d %d %d %d", &arr[0], &arr[1], &arr[2], &arr[3], &arr[4]);
    
  • 但如果不知道输入的整数个数(比如用户想输入任意多个数字直到结束),那一次scanf调用就做不到了——因为你没法在格式串里写无限个%d,也没有语法能让scanf自动填充任意长度的数组。这种情况下,你得用循环多次调用scanf,直到输入结束(比如用户按下Ctrl+D/Ctrl+Z)或者数组满了:
    #include <stdio.h>
    
    int main() {
        int arr[100]; // 先定义一个足够大的数组
        int count = 0;
        int input_num;
    
        // 循环读取,直到scanf返回值不是1(说明读不到有效整数了)
        while (scanf("%d", &input_num) == 1 && count < 100) {
            arr[count++] = input_num;
        }
    
        // 验证一下输入结果
        printf("你输入了%d个整数:", count);
        for (int i = 0; i < count; i++) {
            printf("%d ", arr[i]);
        }
        return 0;
    }
    

2. 「%d...等效于%s」的说法属实吗?

完全不属实!这绝对是个误解:

  • %s是用来读取字符串的,它会从输入中连续读取非空白字符,直到遇到空白为止,把结果存入字符数组;
  • %d是用来读取单个十进制整数的,每次只能解析一个整数,而且C语言的scanf格式串里根本没有%d...这种写法——格式串里的每个%d都必须对应一个整型指针参数,没有所谓的“省略号自动读取多个”的语法。

这种错误说法可能是把变长参数函数的特性和scanf格式串搞混了,但二者完全不是一回事,千万别信这个!

内容的提问来源于stack exchange,提问作者bilanush

火山引擎 最新活动