C语言中sscanf输入格式不匹配时的行为及代码运行结果咨询
C语言中sscanf输入格式不匹配时的行为分析
测试代码
#include <stdio.h> int main(int argc, const char *argv[]) { FILE *fp = fopen("input.txt", "r"); char buffer[256]; int n, a, b; n = a = b = 0; while (fgets(buffer, 250, fp)) { n = sscanf(buffer, "%d %d", &a, &b); printf("%d %d %d\n", a, b, n); } fclose(fp); printf("Next Part\n"); fp = fopen("input.txt", "r"); n = a = b = 0; while (0 < (n = fscanf(fp, "%d %d", &a, &b))){ printf("%d %d %d\n", a, b, n); } return 0; }
输入文件input.txt内容
1 2 3 4 abc 5 6 7 8 the 1 next 2 line 3 is blank 4 5 the above line is blank 6 7 8
第一部分:逐行读取+sscanf解析的行为
sscanf的核心逻辑:从输入字符串按格式匹配数据,返回成功匹配并完成赋值的参数个数;遇到无法匹配格式的字符时立即停止解析,未匹配的参数对应变量不会被修改;若开头无匹配项,返回0。
逐行对应输出及解释:
- 第一行
1 2 3:成功匹配两个整数,返回2,输出1 2 2。 - 第二行
4 abc 5 6:先匹配整数4赋值给a,后续abc无法匹配%d,解析终止,仅成功匹配1个参数,返回1。b保持上一次的取值2,输出4 2 1。 - 第三行
7 8:成功匹配两个整数,返回2,输出7 8 2。 - 第四行
the 1 next 2 line 3 is blank:开头the无法匹配%d,sscanf直接返回0,a和b保持上一次的7和8,输出7 8 0。 - 第五行(空行):无任何可匹配
%d的内容,sscanf返回0,a和b仍为7和8,输出7 8 0。 - 第六行
4 5 the above line is blank 6:成功匹配两个整数,返回2,输出4 5 2。 - 第七行
7 8:成功匹配两个整数,返回2,输出7 8 2。
第二部分:fscanf直接读取的行为
fscanf的匹配规则与sscanf一致,但它从文件流读取,会自动跳过所有空白字符(换行、空格、制表符等),且匹配失败时,未匹配的字符会留在输入流中,影响后续读取。循环条件0 < n意味着仅当成功匹配至少1个参数时才继续。
对应输出及解释:
- 读取
1和2,返回2,输出1 2 2,文件指针停在3后的换行处。 - 跳过换行后读取
4,后续abc无法匹配%d,返回1,输出4 2 1,此时文件指针停在abc的第一个字符a处。 - 下一次调用fscanf时,尝试匹配
%d但遇到a,匹配失败返回0,不满足循环条件,循环终止。
因此第二部分仅输出两行:
1 2 2 4 2 1
关键总结
- sscanf返回成功赋值的参数数量,未匹配的变量保持原值。
- 遇到不匹配字符时,sscanf立即停止解析,返回当前成功数。
- 空行或无匹配内容时,sscanf返回0,变量不修改。
- fscanf会跳过空白字符,但匹配失败后的残留字符会导致后续匹配失败,直接终止循环。
内容的提问来源于stack exchange,提问作者A Lumpkin
相关产品推荐
相关产品推荐

