关于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
相关产品推荐
相关产品推荐

