例如,考虑以下代码 -
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 是指向之前声明的对象的指针,
当我像fscanf(fp,"%d:%d:%[^:]s:%[^n]n"
一样放s
时,读取了第三个而不是最后一个
输出为 -- 4:0:Abridge::
但是当我这样做时fscanf(fp,"%d:%d:%[^:]:%[^n]sn"
所有人都被阅读了输出为 -- 4:0:Abridge:To condense:
并且没有任何地方 fscanf(fp,"%d:%d:%[^:]:%[^n]n"
全部读取输出为 --'4:0:删节:浓缩:
为什么??
要回答您的问题,%[^n]s
有两个格式说明符的含义是什么,一个是[]
,另一个是s
。
现在第一个将扫描除n
以外的任何内容,然后它得到一个n
并将其保存在标准中。然后继续前进。但它并不止于此 - 它基本上会尝试找到字母 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.
说明符是"%[]"
,你不需要那里的"s"
。
阅读手册页了解scanf()
格式字符串与输入不匹配,因为"s"
不是说明符的一部分,并且它不存在于格式需要它的输入中。
通过阅读上面链接中的文档,您会发现(如果您还不知道(在调用printf()
之前还应该检查 scanf()
的返回值,否则您的代码将调用未定义的行为,因为某些传递的指针不会被初始化。