我读了这里,但我无法理解它。
//assume a and b are char arrays
scanf("%[^,]s",a); // first scanf()
scanf("%[^,],s",b); // second scanf() 我可以理解,第一个scanf()将扫描字符串,直到遇到','。但是第二个呢?
这个链接说第一个scanf()不会破坏逗号,而第二个scanf()会破坏它。
trash the comma到底是什么意思?
发布于 2014-07-05 22:48:23
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);
}发布于 2014-07-05 22:56:38
请注意,%[…]本身就是一个完整的转换规范。有关血淋淋的详细信息,或您系统上的手册页,请参阅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中。
发布于 2014-07-05 22:56:23
它们都在目标变量(a或b)中放置相同的字符,但第二个字符也跳过逗号,以便下一次读取不会以逗号开头。
https://stackoverflow.com/questions/24591170
复制相似问题