C语言读取空格分隔的未知数量整数遇换行停止,求更简单实现方法
更简单的实现方案
你原有代码的几个明显隐患:
- 存在空指针访问风险:
for循环中先调用strtok获取下一个分割结果,未判断是否为NULL就直接传入atoi,若输入末尾带空格、或输入为空时会直接崩溃 - 容量硬编码限制:数组、输入缓冲区都写死了大小,超出限制会发生缓冲区溢出
- 逻辑冗余:不需要手动做字符串分割,C标准库的格式化输入函数已经可以直接处理空格分隔的数值输入
场景1:接受固定最大输入数量
如果你的业务场景里输入整数的数量不会超过100个,直接用scanf+ungetc的组合就能实现,比手动读行拆分逻辑简洁很多:
#include <stdio.h> int main(void) { int a[100]; int cnt = 0; // 读满数组/读入失败/遇到换行就终止 while (cnt < 100 && scanf("%d", &a[cnt]) == 1) { cnt++; int next_char = getchar(); if (next_char == '\n') break; ungetc(next_char, stdin); // 非换行字符放回输入流供下次读取 } // cnt变量就是实际读到的整数数量 return 0; }
场景2:支持任意数量的整数输入
如果需要适配完全未知的输入数量,只需要加动态内存扩容的逻辑即可,不需要做字符串分割处理:
#include <stdio.h> #include <stdlib.h> int main(void) { int *arr = NULL; int cnt = 0, cap = 0, num; while (scanf("%d", &num) == 1) { // 空间不足时自动扩容 if (cnt >= cap) { cap = cap == 0 ? 4 : cap * 2; arr = realloc(arr, cap * sizeof(int)); if (!arr) { perror("内存分配失败"); return 1; } } arr[cnt++] = num; int next_char = getchar(); if (next_char == '\n') break; ungetc(next_char, stdin); } // 业务逻辑使用arr和cnt free(arr); // 不要忘记释放动态申请的内存 return 0; }
内容的提问来源于stack exchange,提问作者Nemo
相关产品推荐
相关产品推荐

