首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扫描:"%[^,]s“与"%[^,],s”

扫描:"%[^,]s“与"%[^,],s”
EN

Stack Overflow用户
提问于 2014-07-05 22:45:29
回答 3查看 297关注 0票数 1

我读了这里,但我无法理解它。

代码语言:javascript
复制
//assume a and b are char arrays

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

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

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

这个链接说第一个scanf()不会破坏逗号,而第二个scanf()会破坏它。

trash the comma到底是什么意思?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-05 22:48:23

scanf("%[^,]s",a);将读取到,,然后 ,留在输入缓冲区中。

scanf("%[^,],s",a);会读到,,在读完,之后,会抛弃

他们两人都会阅读和丢弃尾随的s

试试下面的示例代码,看看不同之处:

代码语言:javascript
复制
#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);
}
票数 3
EN

Stack Overflow用户

发布于 2014-07-05 22:56:38

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

在你的两份声明中:

代码语言:javascript
复制
scanf("%[^,]s",a);     // first scanf()

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

代码语言:javascript
复制
scanf("%[^,],s",b);    // second scanf() 

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

这两个陈述都写得很糟糕。如果代码测试返回状态,并将其编写为:

代码语言:javascript
复制
if (scanf("%[^,],s", b) != 1)
    …report problem…

注意,如果输入中的下一个字符是逗号,那么所有语句都将返回0,这表明没有任何信息可以读取到b中。

票数 3
EN

Stack Overflow用户

发布于 2014-07-05 22:56:23

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24591170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档