首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么“%d%*c”与"%d%d%d“一样好?

为什么“%d%*c”与"%d%d%d“一样好?
EN

Stack Overflow用户
提问于 2013-05-15 06:09:15
回答 1查看 22.1K关注 0票数 1

我知道%d格式说明符在这里在fscanf()中使用时,会读取整数并忽略它前面的空格,包括下面程序中的换行符(我验证了).But,该程序使用fscanf()从包含3个整数的多行文件中读取数据,格式字符串"%d%d%d%*c"的工作性能与"%d%d%d"一样好。

为什么是这样呢?由于与fscanf()一起使用的%d是格式说明符字符串中的第一个格式说明符,因此忽略整数之前的任何空格,为什么用作最后一个说明符的额外%*c没有引起任何错误或副作用?难道%d说明符没有忽略一行中每组3个数字之后的换行符,那么%*c就有意义了,因为它会吞噬newline.But --为什么它工作时没有错误或副作用--即使fscanf()默认忽略%d的空格?当%*c不能找到要吃的字符时,不应该停止扫描吗?说明符和输入之间存在不匹配?当出现不匹配时,fscanf()不应该停止吗,就像scanf()一样?

编辑:它甚至可以工作,如果我使用"%*c%d%d%d"不应该停止扫描和处理后续字符,一旦格式说明符和输入开始不匹配?

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>


int main ()
{
int n1,n2,n3;
FILE *fp;
fp=fopen("D:\\data.txt","r");

if(fp==NULL)
{
printf("Error");
exit(-1);
}

while(fscanf(fp,"%d%d%d%*c",&n1,&n2,&n3)!=EOF) //Works as good as line below
//while(fscanf(fp,"%d%d%d",&n1,&n2,&n3)!=EOF)
printf("%d,%d,%d\n",n1,n2,n3);
fclose(fp);

}

以下是我的文件data.txt中数据的格式

代码语言:javascript
复制
243 343 434
393 322 439
984 143 943
438 243 938

输出:

代码语言:javascript
复制
243 343 434
393 322 439
984 143 943
438 243 938
EN

回答 1

Stack Overflow用户

发布于 2013-05-15 06:30:41

在成功时,函数返回成功填充的参数列表中的项目数。由于匹配失败、读取错误或文件结束的影响,此计数可以与预期的项目数匹配,或小于(甚至为零)。

上面的段落从未提到停止在mismatch.it上也会尝试额外的说明符,而且由于没有输入,所以它只返回成功扫描的number.If格式规范有太多的参数,额外的参数被忽略了。如果对格式规范没有足够的参数,则结果是未定义的。

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

https://stackoverflow.com/questions/16557997

复制
相关文章

相似问题

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