繁体   English   中英

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

[英]Question in how scanf_s detect characters in C

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

我不明白三件事。

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

  2. 在第11行,放置了%3c ,而在第13行, fprintf c2给出了一个空白。 我不知道%3c在这里是什么意思。 据我所知,该术语应指的是接受三个字符,但是这里似乎并非如此。

  3. 在第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上搜索信息。 这一页为我提供了有关您在此处提出的答案的许多信息。 虽然,我必须承认某些行为仍然不明显,但我希望我能够帮助您更好地理解代码中正在发生的事情。

  1. fscanf_s与[ fscanf ]相同,除了%c%s%[转换说明符每个都期望两个参数(通常的指针和指示接收数组大小的rsize_t类型的值,当使用一个%c转换为一个char )“。(来源:上面的链接

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


  1. 在运行时检测到以下错误,并调用当前安装的约束处理程序函数:[...] %c%s%[加上终止的空字符将要写入的字符数将超过第二个(为每个转换说明符提供了rsize_t)参数(来源:上面的链接

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


  1. %%与文字%匹配(来源:上面的链接

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM