You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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]会越界,触发内存错误。

正确实现方向

核心逻辑是:读取整数的同时,校验输入流中除了整数、合法分隔符(空格、换行、制表符)外,不存在其他字符。
具体实现步骤:

  1. 每次调用fscanf读取整数,先判断返回值:
    • 返回EOF:说明正常读取到文件末尾,所有内容校验通过,返回true
    • 返回0:说明当前位置存在无法匹配为整数的非法字符,直接报错返回false
    • 返回1:成功读取一个整数,接下来逐字符检查后续内容,直到遇到下一个非空白字符:
      • 如果非空白字符是EOF,返回true
      • 如果非空白字符可以作为下一个整数的开头(数字、+、-),继续下一轮读取
      • 其他情况均为非法字符,报错返回false
  2. 增加数组下标越界校验,避免写入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 10:36:10