[英]Question in how scanf_s detect characters in C
我试图了解这些键入的代码如何影响结果。 该函数是fscanf_s
。
我不明白三件事。
在第11和12行中,在&c1
, &c2
和&c3
,键入某些数字。删除这些数字将导致out.txt
打印空白。 我不知道为什么之间必须有数字。
在第11行,放置了%3c
,而在第13行, fprintf
c2
给出了一个空白。 我不知道%3c
在这里是什么意思。 据我所知,该术语应指的是接受三个字符,但是这里似乎并非如此。
在第12行,放置了%%
,仅更改了c4
。 我了解这可能是%%
停止了扫描过程,但是我对此不太确定。 fscanf_s
是否不承认%%
之后必须再扫描一个%c
?
我知道fscanf_s
显示的行为与scanf_s
类似,但是知道它们并不能完全给我答案。
char c1 = 'a', c2 = 'b', c3 = 'c', c4 = 'd', c5 = 'e', c6 = 'g';
int i, j;
FILE* infile, * outfile;
fopen_s(&infile, "data.txt", "r");
fopen_s(&outfile, "out.txt", "w");
i = fscanf_s(infile, "%c%3c%c", &c1, 1, &c2, 1, &c3, 1); //this line 11
j = fscanf_s(infile, "%c %% %c", &c4, 1, &c5, 1, &c6, 1);//and this line 12
fprintf(outfile, "%c%c%c: (%d)\n", c1, c2, c3, i);
fprintf(outfile, "%c%c%c: (%d)\n", c4, c5, c6, j);
data.txt打印如下:
ABCDEFGHIJKLMN
out.txt打印如下:
A c: (1)
Deg: (1)
您应该介意在CppReference上搜索信息。 这一页为我提供了有关您在此处提出的答案的许多信息。 虽然,我必须承认某些行为仍然不明显,但我希望我能够帮助您更好地理解代码中正在发生的事情。
fscanf_s
与[fscanf
]相同,除了%c
,%s
和%[
转换说明符每个都期望两个参数(通常的指针和指示接收数组大小的rsize_t
类型的值,当使用一个%c转换为一个char
)“。(来源:上面的链接 )
好了,您在这里找到了其他数字的来源。 它们只是数字,用于指定您将收到的字符数,必须是char
的一个。
在运行时检测到以下错误,并调用当前安装的约束处理程序函数:[...]
%c
,%s
或%[
加上终止的空字符将要写入的字符数将超过第二个(为每个转换说明符提供了rsize_t)参数(来源:上面的链接 )
这意味着当使用%3c
但参数&c2, 1
您尝试从文件中获取3个字符,但在c2中只需要一个字符...这将导致约束处理程序函数处理错误并在第11行调用应该返回EOF。 我必须承认,我仍然对您得到的行为感到有些困惑(函数调用返回1),但是%3c
与参数&c2, 1
的使用肯定存在问题。
%%
与文字%匹配(来源:上面的链接 )
使用%%
似乎会强制fscanf_s
在文件内找到%
字符。 由于没有看到任何内容,它仅遍历您的文件,到达EOF
,并且函数结束,而无需修改c5
和c6
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.