我读了它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
到底意味着什么?
答案 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读取不会以它开头。