[英]Why can I not use fscanf() to read consecutive characters from a file?
[英]If I use fscanf to read a file, can I use it to store the number of characters it reads?
我正在嘗試使用fscanf
從文件中讀取一堆單詞(全部在單獨的行上),並且我想找到每個單詞的長度。 fscanf
是否允許我這樣做,或者如果沒有,還有其他方法嗎? 我一直在尋找關於“輸入項成功匹配和分配”的解釋,但這仍然有點令人困惑。
要查找掃描單詞(或int
、 double
、...)的文本長度,請在說明符前后添加一對"%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.