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

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. 读取1和2,返回2,输出 1 2 2,文件指针停在3后的换行处。
  2. 跳过换行后读取4,后续abc无法匹配%d,返回1,输出 4 2 1,此时文件指针停在abc的第一个字符a处。
  3. 下一次调用fscanf时,尝试匹配%d但遇到a,匹配失败返回0,不满足循环条件,循环终止。

因此第二部分仅输出两行:

1 2 2
4 2 1

关键总结

  • sscanf返回成功赋值的参数数量,未匹配的变量保持原值。
  • 遇到不匹配字符时,sscanf立即停止解析,返回当前成功数。
  • 空行或无匹配内容时,sscanf返回0,变量不修改。
  • fscanf会跳过空白字符,但匹配失败后的残留字符会导致后续匹配失败,直接终止循环。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 03:26:11