繁体   English   中英

如果我使用 fscanf 读取文件,我可以使用它来存储它读取的字符数吗?

[英]If I use fscanf to read a file, can I use it to store the number of characters it reads?

我正在尝试使用fscanf从文件中读取一堆单词(全部在单独的行上),并且我想找到每个单词的长度。 fscanf是否允许我这样做,或者如果没有,还有其他方法吗? 我一直在寻找关于“输入项成功匹配和分配”的解释,但这仍然有点令人困惑。

要查找扫描单词(或intdouble 、...)的文本长度,请在说明符前后添加一对"%n" "%n"保存扫描偏移并且不影响scanf()返回值。

int n1;
int n2;
char buff[100];
//            v-------- space to consume leading white-space
while (scanf(" %n%99s%n", &n1, buff, &n2) == 1) {
  printf("word <%s> length: %d\n", buff, n2 - n1); 
}

如果项目是带有"%f"double精度,带有"%d"int ,则上述工作同样有效,...。


对于"%s" ,可以在扫描后使用strlen()找到字符串的长度。

char buff[100];
while (scanf("%99s", buff) == 1) {
  printf("word <%s> length: %zu\n", buff, strlen(buff)); 
}

先进的

学究式地,输入可能包括嵌入的 null 字符 Null 字符通常不会在文本文件中找到,除非是偶然(将 UTF-16 读取为 UTF-8)或恶意用户。 使用"%s" ,读取null 字符将被视为任何其他非空白字符。 因此, " %n%99s%n"方法可能导致长度超过strlen()


我一直在寻找关于“输入项成功匹配和分配”的解释,但这仍然有点令人困惑。

scanf()的返回值大致是匹配说明符的计数,而不是单词的长度。 如果扫描不完整,则返回值可能小于说明符的数量;如果第一次遇到文件结尾,则返回值可能小于EOF "%n"不计入此计数。 带有"*"的说明符也没有贡献。

暂无
暂无

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

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