C语言如何不硬编码实现单次单行输入多值存入自定义长度数组
实现原理
scanf的%d格式符会自动跳过所有空白字符(空格、制表符、换行符),因此不需要硬编码写全所有格式占位符,循环逐次读取单个%d即可自动匹配同一行内空格分隔的多个数值。
错误代码问题排查
你在循环内部写了5个%d但仅传入了1个存储地址,每次循环会尝试读取5个数值但仅存储第一个,剩余数值会被丢弃,同时末尾的\n会强制匹配输入中的换行符,反而会导致输入卡住。
正确实现方案
方案1:基础循环读取(兼容多场景,最常用)
这种方案不需要硬编码格式符数量,数组长度无论是宏定义还是用户动态输入都可以直接适配,不限制用户必须在同一行输入,就算用户分多行输入也能正常读取,符合绝大多数场景需求。
适配宏定义长度场景
#include <stdio.h> #define MAX 10 int main() { int arr[MAX]; int i; printf("请输入%d个空格分隔的数字:\n", MAX); for (i = 0; i < MAX; i++) { // 每次循环只读一个%d,自动跳过空白符,同一行输入会按顺序读取 scanf("%d", &arr[i]); } // 输出验证 for (i = 0; i < MAX; i++) { printf("%d ", arr[i]); } return 0; }
适配用户动态输入长度场景
#include <stdio.h> int main() { int limit; printf("what is the limit? : "); scanf("%d", &limit); int arr[limit]; int i; printf("请输入%d个空格分隔的数字:\n", limit); for (i = 0; i < limit; i++) { scanf("%d", &arr[i]); } // 输出验证 for (i = 0; i < limit; i++) { printf("%d ", arr[i]); } return 0; }
方案2:严格限制同一行输入
如果要求用户必须把所有数值输入在同一行,禁止跨行读取,可以先读取整行内容再逐位解析:
#include <stdio.h> #include <string.h> #define MAX_LINE 1024 // 定义输入行的最大长度 int main() { int limit; printf("what is the limit? : "); scanf("%d", &limit); // 吃掉前面scanf留下的换行符,避免后面fgets读空行 getchar(); int arr[limit]; char line[MAX_LINE]; printf("请在同一行输入%d个空格分隔的数字:\n", limit); // 先读取完整一行内容 fgets(line, sizeof(line), stdin); char *ptr = line; int offset, i = 0; // 循环从行字符串中读取数字,直到读够指定数量 while (i < limit && sscanf(ptr, "%d%n", &arr[i], &offset) == 1) { ptr += offset; i++; } // 输出验证 for (i = 0; i < limit; i++) { printf("%d ", arr[i]); } return 0; }
内容的提问来源于stack exchange,提问作者Fulyze Chan
相关产品推荐
相关产品推荐

