如何通过一次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




