C语言如何编写验证文件仅含整数的函数?现有代码异常无反应该如何修复?
C语言文件整数格式校验问题解答
现有代码错误点
- fscanf返回值判断逻辑错误:
fscanf("%d", &num)匹配成功返回1,匹配失败返回0,到达文件末尾返回EOF。原有循环条件仅判断返回值是否为非0,当遇到12x这类内容时,fscanf先成功读取12返回1进入循环,下一次读取时遇到x匹配失败返回0,循环直接退出,不会触发错误判断,程序看似无反应。 isdigit用法完全错误:isdigit的入参是单个字符的ASCII编码,用于判断该字符是否为0-9的数字字符,你传入读取到的整数值(比如12、20这类),完全不符合函数的使用场景,逻辑不成立。- 函数无完整返回值:函数声明为bool返回类型,原有代码仅在报错时返回false,正常执行完循环后没有返回值,属于未定义行为。
- 存在数组越界风险:numArray长度仅为26,当文件内整数数量超过26时,i自增后访问numArray[i]会越界,触发内存错误。
正确实现方向
核心逻辑是:读取整数的同时,校验输入流中除了整数、合法分隔符(空格、换行、制表符)外,不存在其他字符。
具体实现步骤:
- 每次调用fscanf读取整数,先判断返回值:
- 返回EOF:说明正常读取到文件末尾,所有内容校验通过,返回true
- 返回0:说明当前位置存在无法匹配为整数的非法字符,直接报错返回false
- 返回1:成功读取一个整数,接下来逐字符检查后续内容,直到遇到下一个非空白字符:
- 如果非空白字符是EOF,返回true
- 如果非空白字符可以作为下一个整数的开头(数字、+、-),继续下一轮读取
- 其他情况均为非法字符,报错返回false
- 增加数组下标越界校验,避免写入numArray时超出数组长度。
参考实现代码
#include <stdio.h> #include <stdbool.h> #include <ctype.h> bool check(FILE *fp) { int numArray[26]; int i = 0; int num; int ret; while ((ret = fscanf(fp, "%d", &num)) != EOF) { // 匹配失败,存在非法字符 if (ret == 0) { fprintf(stderr, "Not correct format\n"); return false; } // 数组越界判断 if (i >= 26) { fprintf(stderr, "Too many numbers\n"); return false; } numArray[i] = num; i++; // 检查后续字符是否合法 int c; // 跳过所有空白字符 while ((c = fgetc(fp)) != EOF && isspace(c)) { ; } if (c == EOF) { // 到文件末尾,校验通过 return true; } // 把读出来的非空白字符塞回流里,供下一次fscanf读取 ungetc(c, fp); // 检查该字符是否可以作为整数的开头:数字、+、- if (!isdigit(c) && c != '+' && c != '-') { fprintf(stderr, "Not correct format\n"); return false; } } // 正常到文件末尾 return true; }
内容的提问来源于stack exchange,提问作者wal238
相关产品推荐
相关产品推荐

