如何验证文本文件首行是否符合%d,%d格式?
解决文本配置首行格式验证问题
原代码的核心错误
- sscanf参数错误:调用
sscanf(line, "%d,%d", s1, s2)时,未传递变量地址(&s1、&s2),导致无法正确赋值,还会触发未定义行为。 - strcmp用法完全错误:
strcmp(line, "%d,%d")是拿输入行和字符串字面量"%d,%d"做对比,永远无法匹配实际整数内容,完全达不到格式验证目的。
正确的实现方案
要验证首行严格符合整数,整数格式,需同时满足两个条件:
- 成功读取两个整数;
- 输入行无多余无效字符(仅允许末尾的换行符)。
以下是两种可靠实现方式:
方法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
相关产品推荐
相关产品推荐

