例如,考虑以下代码 -
fscanf(fp,"%d:%d:%[^:]:%[^\n]\n",&pow->no,&pow->seen,pow->word,pow->means);
printf("\ntthis is what i read--\n%d:%d:%s:%s:\n",pow->no,pow->seen,pow->word,pow->means);
这里pow是指向之前声明的对象的指针,
当我把s
放在fscanf(fp,"%d:%d:%[^:]s:%[^\n]\n"
时,第三个被读,但不是最后一个
输出是 - 4:0:Abridge::
但当我做fscanf(fp,"%d:%d:%[^:]:%[^\n]s\n"
所有读取输出是 - 4:0:Abridge:To condense:
并且没有任何地方fscanf(fp,"%d:%d:%[^:]:%[^\n]\n"
都读取输出是 - `4:0:Abridge:凝聚:
为什么??
要回答你的问题,%[^\n]s
的意思是什么,有两个格式说明符,一个是[]
,另一个是s
。
现在第一个将扫描除\n
以外的任何东西,然后它得到一个\n
并将其保存在stdin中。继续前进。但它并没有停在这里 - 它基本上试图找到一个匹配的字母s
。如果它找不到它 - 它失败了。 (%[^:]s
的解释与此相同)。
现在决定这是否是你真正想要的.[^\n]
是正确的,它将扫描直到找到\n
(是的,它不会像%s
那样跳过空白)。 scanset也涵盖了包括s
在内的信件。而且%[^\n]s
不仅仅是自相矛盾的。所以也没有使用它。
%d:%d:%[^:]s:%[^\n]
%d - Matches an optionally signed decimal integer. (Ignore whitespace)
: - Then looks for ':'
%d - Matches an optionally signed decimal integer. (Ignore whitespace)
: - Then looks for ':'
%[^:] - No white space ignored - everything is taken into input except `:`
':' is unread.
s - Tries to match 's'. No white space ignored.
%[^\n] - Everything except '\n' inputted. `\n` left unread.
说明符IS "%[]"
,你不需要那里的"s"
。
您的格式字符串与输入不匹配,因为您的"s"
不是说明符的一部分,并且它不存在于格式所期望的输入中。
通过阅读上面链接中的文档,您将发现 - 如果您还不知道 - 您还应该在调用scanf()
之前检查printf()
的返回值,否则您的代码将调用未定义的行为,因为一些传递的指针不要初始化。