代码之家  ›  专栏  ›  技术社区  ›  STG Ahs N

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

  •  0
  • STG Ahs N  · 技术社区  · 7 年前

    例如,考虑以下代码-

    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:

    任何地方都没有s fscanf(fp,"%d:%d:%[^:]:%[^\n]\n" 全部已读取 输出为-- `4: 0:缩写:浓缩:

    为什么?

    2 回复  |  直到 7 年前
        1
  •  2
  •   user2736738    7 年前

    回答你的问题 %[^\n]s 有两个格式说明符,一个是 [] 另一个是 s .

    现在第一个将扫描除 \n 然后它得到一个 \n个 并将其保存在stdin中。继续前进。但这并不仅仅限于此,它基本上是在试图找到与字母匹配的字母 s . 如果找不到它,它就会失败。(解释带有 %[^:]s 将与此相同)。

    现在决定这是否是你真正想要的。 [^\n] 是将扫描到 \n个 找到(是的,它不会像 %s do)。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
  •  2
  •   Iharob Al Asimi    7 年前

    说明符 "%[]" ,您不需要 "s" 那里

    阅读 manual page for scanf()

    您的格式字符串与输入不匹配,因为您 “s” 不是说明符的一部分,也不存在于格式所需的输入中。

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