C语言读取逗号分隔整数存入带问号数组的scanf校验问题
问题解决方法
原有代码的核心问题
- 基础语法错误:数组名误用(定义为
Array1却用Array访问)、char类型数组用来存储%d读取的整数会导致溢出、循环判断的是未赋值的数组元素,逻辑本身无法正常运行 - 校验失效原因:
scanf格式串中的分隔符如果匹配失败,不会主动抛出错误,你没有判断scanf的返回值,就无法确认逗号是否真实存在,因此分隔符校验完全不生效。%d,格式下如果读完整数后下一个字符不是逗号,scanf只会返回已读到的整数数量(返回值为1),不会终止程序,相当于直接跳过了逗号校验。
正确实现方案
#include <stdio.h> #define MAX_SIZE 100 int main() { int arr[MAX_SIZE]; int count = 0; int num; char delimiter; while (count < MAX_SIZE) { // 同时读取整数和后续的分隔符,通过返回值判断读取是否成功 int ret = scanf("%d%c", &num, &delimiter); if (ret != 2) { printf("输入格式错误\n"); return 1; } arr[count++] = num; // 明确校验分隔符类型 if (delimiter == '?') { // 读到结束标志,终止循环 break; } else if (delimiter != ',') { printf("格式错误:数字间必须用逗号分隔,末尾需用问号结束\n"); return 1; } } // 测试输出读取结果,可根据需求删除 printf("读取到的%d个整数:\n", count); for (int i = 0; i < count; i++) { printf("%d ", arr[i]); } return 0; }
逻辑说明
- 每次调用
scanf后强制校验返回值:只有返回值为2时才代表成功读取到了整数和后续的分隔符,其余情况直接判定为输入不合法 - 分隔符二次校验:读取到分隔符后直接判断是逗号还是问号,其余字符都判定为格式错误,完全规避了
scanf默认跳过校验的问题 - 增加了数组越界防护,避免输入内容过长导致缓冲区溢出
内容的提问来源于stack exchange,提问作者user12359309
相关产品推荐
相关产品推荐

