【问题标题】:Why there should not be type specifier like s or c after [0-9A-Z^%]?为什么 [0-9A-Z^%] 后面不应该有 s 或 c 之类的类型说明符?
【发布时间】:2018-03-04 13:39:50
【问题描述】:

例如考虑以下代码 -

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:

AND 没有 s 任何地方 fscanf(fp,"%d:%d:%[^:]:%[^\n]\n" 都被读取 输出是—— `4:0:Abridge: 浓缩:

为什么??

【问题讨论】:

  • 不清楚你的意思。
  • 请从您的文本文件中显示输入行的样子。
  • 为什么 s 在阅读时会失败:之后?你能详细说明一下吗
  • @STG 如果s 出现在格式字符串中,并且由于它不是格式说明符 的一部分,那么scanf() 将尝试匹配s 文字。但是因为它不存在于扫描的字符串中,所以它当然会失败。与 ':' 字符发生的情况相同,它在格式中是必需的,因为它存在于输入中,在扫描完非常令牌之后,scanf() 将首先尝试查找紧随其后且位于下一个格式说明符之前的文本.
  • 知道了,因为下一个输入直到 \n 被读取但没有存储在任何地方,当我再次尝试使用 [^\n] 读取时它什么也没存储,谢谢

标签: c file scanf


【解决方案1】:

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

【讨论】:

  • 看!你的答案比我的好……我有一个 xfce4-panel 插件来通知堆栈溢出,如果你使用 xfce4 桌面,我可以将它发送给你。
  • @IharobAlAsimi.: 没办法……对不起,如果我在你之后的回答听起来像那个。你和其他许多人都知道事实并非如此。我不使用它 - 我的笔记本电脑非常低 ..2GB 内存,我认为任何其他软件都不适合。
  • 你能告诉我[a-z,A-Z,^%] 如果输入是 Abcd%ef 会读 Abcd
  • ^ 字符呢
  • @STG.:检查标准。 括号(扫描列表)之间的字符组成扫描集,除非左括号之后的字符是一个抑扬符(^),在这种情况下扫描集包含所有未出现在抑扬符之间的扫描列表中的字符和右括号。
【解决方案2】:

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

阅读manual page for scanf()

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    相关资源
    最近更新 更多