scanf:“%[^,] s”vs“%[^,],s”

时间:2014-07-05 22:45:30

标签: c scanf

我读了它here,但我无法理解它。

//assume a and b are char arrays

scanf("%[^,]s",a);     // first scanf()

scanf("%[^,],s",b);    // second scanf() 

我可以理解,第一个scanf()将扫描字符串,直到遇到','。但是第二个呢?

link表示第一个scanf()不会删除逗号,而第二个{@ 1}}会删除逗号。

trash the comma到底意味着什么?

3 个答案:

答案 0 :(得分:3)

scanf("%[^,]s",a);最多可读取,,然后 ,保留在输入缓冲区中。
scanf("%[^,],s",a);将阅读,,在阅读,后,它会弃置

他们都将阅读并放弃尾随s

尝试此示例代码并查看差异:

#include <stdio.h>
int main()
{
   char a[10];
   char b;
   scanf("%[^,]s",a);
   //scanf("%[^,],s",b); 
   scanf("%c", &b);
   printf("%s\n%c", a, b);
}

答案 1 :(得分:3)

请注意,%[…]本身就是一个完整的转换规范。有关详细信息,请参阅scanf()的POSIX规范,或查看系统上的手册页。

在你的两个陈述中:

scanf("%[^,]s",a);     // first scanf()

这种作品,但并没有真正做到你(可能)期望它做的事情。它会读取第一个逗号之前的非逗号字符序列,然后无法匹配s,但无法报告该失败。输入中的下一个字符将是逗号(如果输入中没有逗号,则为EOF)。

scanf("%[^,],s",b);    // second scanf() 

这也有点作用,但也没有达到你期望的效果。它读取一系列非逗号字符,然后是逗号,然后是s,但它也无法报告它是读取逗号还是后面的s。如果在输入中有逗号和s之后,那么下一个输入字符将是s之后的任何字符。如果有逗号和非s,那么非s将是下一个字符读取。否则,下一次读取将返回EOF。

这两个陈述写得很糟糕。如果代码测试了返回状态会更好,并写成:

if (scanf("%[^,],s", b) != 1)
    …report problem…

请注意,如果输入中的下一个字符是逗号,则所有语句都将返回0,表示没有信息可以读入b

答案 2 :(得分:0)

它们都在目标变量(a或b)中放置相同的字符,但第二个字符也跳过逗号,以便NEXT读取不会以它开头。