关于scanf_s如何检测C中的字符的问题

时间:2019-07-01 11:55:08

标签: c scanf

我试图了解这些键入的代码如何影响结果。该函数为fscanf_s

我不明白三件事。

  1. 在第11行和第12行的&c1&c2&c3之间,键入某些数字。删除这些数字将导致out.txt打印空白空间。我不知道为什么之间必须有数字。

  2. 在第11行放置%3c,在第13行放置c2的{​​{1}}仅留有空白。我不知道fprintf在这里是什么意思。据我所知,该术语指的是接受三个字符,但这似乎不是这种情况。

  3. 在第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

1 个答案:

答案 0 :(得分:0)

您应该介意在CppReference上搜索信息。 This single page给了我许多有关您在此处询问答案的信息。虽然,我必须承认某些行为仍然不明显,但我希望我能够帮助您更好地理解代码中正在发生的事情。

  1.   

    fscanf_s与[fscanf相同,除了%c%s%[转换说明符每个都期望两个参数(通常的指针和类型为rsize_t的值,表示接收数组的大小,当用%c读入单个char)时可以为1。(来源:上面的link)< / p>

    好的,您在这里找到了其他号码的来源。它们只是数字,用于指定您将收到的字符数,对于char必须为一个。


  1.   

    在运行时检测到以下错误,并调用当前安装的constraint handler函数:[...] %c%s或{{ 1}},再加上终止的空字符,将超过为每个转换说明符提供的第二个(rsize_t)参数(来源:上述link

    这意味着当使用%[但使用参数%3c时,您尝试从文件中获取3个字符,但在c2中只需要一个字符...这将导致{处理的错误{3}}函数,您在第11行的调用应返回EOF。我必须承认,我仍然对您得到的行为感到有些困惑(函数调用返回1),但是将&c2, 1与参数%3c一起使用肯定有问题。


  1.   

    &c2, 1与文字%匹配(来源:上述constraint handler

    使用%%似乎迫使%%在文件内找到fscanf_s字符。由于没有看到任何内容,它只遍历您的文件,到达%,并且函数结束,而无需修改EOFc5