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

如何验证文本文件首行是否符合%d,%d格式?

解决文本配置首行格式验证问题

原代码的核心错误

  • sscanf参数错误:调用sscanf(line, "%d,%d", s1, s2)时,未传递变量地址(&s1、&s2),导致无法正确赋值,还会触发未定义行为。
  • strcmp用法完全错误:strcmp(line, "%d,%d")是拿输入行和字符串字面量"%d,%d"做对比,永远无法匹配实际整数内容,完全达不到格式验证目的。

正确的实现方案

要验证首行严格符合整数,整数格式,需同时满足两个条件:

  1. 成功读取两个整数;
  2. 输入行无多余无效字符(仅允许末尾的换行符)。

以下是两种可靠实现方式:

方法1:捕获剩余字符验证

#include <stdio.h>
#include <string.h>

int validate_config(FILE *fp) {
    char line[100];
    // 读取首行,失败则返回错误
    if (!fgets(line, sizeof(line), fp)) {
        return 1;
    }

    int s1, s2;
    char leftover;
    // 读取两个整数并捕获后续第一个字符
    int read_count = sscanf(line, "%d,%d%c", &s1, &s2, &leftover);

    // 合法情况:要么刚好读取2个整数,要么读取2个整数后只剩换行符
    if (!(read_count == 2 || (read_count == 3 && leftover == '\n'))) {
        return 1;
    }

    // 格式验证通过,可在此处使用s1和s2
    return 0;
}

方法2:用%n记录读取位置验证

#include <stdio.h>
#include <string.h>

int validate_config(FILE *fp) {
    char line[100];
    if (!fgets(line, sizeof(line), fp)) {
        return 1;
    }

    // 移除末尾换行符(如果存在)
    size_t line_len = strlen(line);
    if (line_len > 0 && line[line_len - 1] == '\n') {
        line[line_len - 1] = '\0';
        line_len--;
    }

    int s1, s2;
    int parse_pos;
    // %n记录sscanf处理到的字符索引
    int read_count = sscanf(line, "%d,%d%n", &s1, &s2, &parse_pos);

    // 必须成功读取2个整数,且处理位置等于字符串总长度(无多余字符)
    if (read_count != 2 || parse_pos != line_len) {
        return 1;
    }

    // 格式验证通过
    return 0;
}

关键逻辑说明

  • 用sscanf的返回值判断是否成功读取2个整数(返回值为2)。
  • 额外验证输入行无多余内容:要么读取完两个整数后无剩余字符,要么剩余的只有fgets读取到的换行符,确保输入严格符合%d,%d格式。

内容的提问来源于stack exchange,提问作者Boosen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 00:50:22