为什么在 [0-9A-Z^%] 之后不应该有像 s 或 c 这样的类型说明符



例如,考虑以下代码 -

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() 的返回值,否则您的代码将调用未定义的行为,因为某些传递的指针不会被初始化。

最新更新