我试图了解这些键入的代码如何影响结果。该函数为fscanf_s
。
我不明白三件事。
在第11行和第12行的&c1
,&c2
和&c3
之间,键入某些数字。删除这些数字将导致out.txt
打印空白空间。我不知道为什么之间必须有数字。
在第11行放置%3c
,在第13行放置c2
的{{1}}仅留有空白。我不知道fprintf
在这里是什么意思。据我所知,该术语指的是接受三个字符,但这似乎不是这种情况。
在第12行,放置%3c
,仅更改%%
。我知道可能c4
停止了扫描过程,但是我对此不太确定。 %%
是否不承认在fscanf_s
之后必须再扫描一次%%
?
我知道%c
的行为与fscanf_s
类似,但是知道它们并不能完全给我答案。
scanf_s
data.txt打印如下:
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);
out.txt打印如下:
ABCDEFGHIJKLMN
答案 0 :(得分:0)
您应该介意在CppReference上搜索信息。 This single page给了我许多有关您在此处询问答案的信息。虽然,我必须承认某些行为仍然不明显,但我希望我能够帮助您更好地理解代码中正在发生的事情。
fscanf_s
与[fscanf
相同,除了%c
,%s
和%[
转换说明符每个都期望两个参数(通常的指针和类型为rsize_t
的值,表示接收数组的大小,当用%c读入单个char
)时可以为1。(来源:上面的link)< / p>
好的,您在这里找到了其他号码的来源。它们只是数字,用于指定您将收到的字符数,对于char
必须为一个。
在运行时检测到以下错误,并调用当前安装的constraint handler函数:[...]
%c
,%s
或{{ 1}},再加上终止的空字符,将超过为每个转换说明符提供的第二个(rsize_t)参数(来源:上述link)
这意味着当使用%[
但使用参数%3c
时,您尝试从文件中获取3个字符,但在c2中只需要一个字符...这将导致{处理的错误{3}}函数,您在第11行的调用应返回EOF。我必须承认,我仍然对您得到的行为感到有些困惑(函数调用返回1),但是将&c2, 1
与参数%3c
一起使用肯定有问题。
&c2, 1
与文字%匹配(来源:上述constraint handler)
使用%%
似乎迫使%%
在文件内找到fscanf_s
字符。由于没有看到任何内容,它只遍历您的文件,到达%
,并且函数结束,而无需修改EOF
和c5
。