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

关于fscanf扫描不同数据类型的疑问:两段C语言代码输出差异解析

关于fscanf字符读取的疑问解答

先看你给出的两段代码:

代码1(输出12)

#include <stdio.h>
int main(void) {
 FILE *f = fopen("file","w");
 int i;
 fputs("12A",f);
 fclose(f);
 f = fopen("file","r");
 fscanf(f,"%d",&i);
 fclose(f);
 printf("%d",i);
 return 0;
}

代码2(输出'1',你对此有疑问)

#include <stdio.h>
int main(void) {
 FILE *f = fopen("file","w");
 char c;
 fputs("12A",f);
 fclose(f);
 f = fopen("file","r");
 fscanf(f,"%c",&c);
 fclose(f);
 printf("%c",c);
 return 0;
}

你理解代码1输出12是因为fscanf("%d")会读取连续的数字直到遇到非数字字符,但困惑代码2用%c为什么输出'1'?其实核心是%c格式符的行为和%d完全不同,咱们一步步说:

1. 先明确文件里的内容

两段代码都用fputs("12A", f)写入了文件,所以文件里的内容是连续的三个字符:'1' → '2' → 'A',没有空格、换行这类额外字符。

2. fscanf("%c", &c)的工作逻辑

%c是专门用来读取单个字符的格式说明符,它的规则非常直白:

  • 当你打开文件读的时候,文件指针默认指向文件的起始位置(也就是第一个字符'1'的位置)。
  • %c不会跳过任何字符(哪怕是空白,这里也没有),它直接读取当前指针指向的那个字符,然后把这个字符赋值给变量c。

所以代码2里,fscanf一上来就读到了文件开头的'1',printf自然就输出'1'了。

和%d的核心区别

再对比代码1的%d:

  • %d是用来读取整数的,它会从当前位置开始,连续读取所有数字字符(0-9),直到遇到非数字的字符(比如这里的'A')才停止,所以它会把'1'和'2'拼成整数12,赋值给i。

补充:如果想读取其他字符怎么办?

要是你本来想读'2'或者'A',可以这么做:

  • 方法一:用fseek移动文件指针,比如在fscanf前加fseek(f, 1, SEEK_SET);,这样指针就跳到第二个字符('2')的位置,读取的就是'2'了。
  • 方法二:多调用几次fscanf("%c", &c),第一次读'1',第二次读'2',第三次读'A'。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 05:42:39