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

问题描述 投票:0回答:2

例如,考虑以下代码 -

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:凝聚:

为什么??

c file scanf
2个回答
1
投票

要回答你的问题,%[^\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.

2
投票

说明符IS "%[]",你不需要那里的"s"

阅读manual page for scanf()

您的格式字符串与输入不匹配,因为您的"s"不是说明符的一部分,并且它不存在于格式所期望的输入中。

通过阅读上面链接中的文档,您将发现 - 如果您还不知道 - 您还应该在调用scanf()之前检查printf()的返回值,否则您的代码将调用未定义的行为,因为一些传递的指针不要初始化。

© www.soinside.com 2019 - 2024. All rights reserved.