我的fscanf函数应该从文件中获取3个数字并将它们存储在charr数组中,然后使用atoi和atof将其转换为int和float。
我如何检查是否:
在第二种情况下,我认为只是测试将字符串转换为int / float是否成功就足够了
if(atoi(numberchar) == 0){printf("sorry error");}
但是,零是我的数字的有效值(浮点数和整数),所以我遇到了问题。
我还注意到,例如输入45kl,atoi / atof函数将其转换为45.所以这里唯一要注意的是输入不是以数字开头的?
为此,我可以写一个条件,如果数组的第一个元素不为零,但atoi / atof函数仍然失败(返回零),那么输入可能在开头有一个非数字字符。
是吗?
答案 0 :(得分:4)
scanf族函数的手册页(man scanf)清楚地表明返回值是分配的输入元素的数量。
如果返回的数字大于零,则它等于根据指定的转换读取的元素数。如果数字为0那么,即使有要读取的元素,如果它们与转换不匹配,也不会分配任何人,如同指定%d但是在读取时遇到一个字母。如果输入失败(如文件末尾),则返回EOF。
因此,fscanf会完成您想要的所有工作,您只需要检查返回的项目数。 如果您期望3个整数,当且仅当它读取3个整数值时,fscanf将返回3。
一般来说,要检查一个数字,我建议使用函数isdigit()。
答案 1 :(得分:1)
我不确定这段代码是否万无一失,但这只是一次尝试:
#include<stdio.h>
int main()
{
FILE *fp;
int a,b,c;
char d;
if ((fp=fopen("touchscanf","r")) == NULL)
{
printf("Sorry! Can't open the file");
}
else
{
while(4 == fscanf(fp,"%d %d %d%c",&a,&b,&c,&d))
{
if(d!='\n')
{ break;}
printf("Intigers scanned are %d %d %d\n",a,b,c);
}
if(!feof(fp))
printf("Input mismatch\n");
}
fclose(fp);
}
根据link
如果输入,fscanf函数返回宏EOF的值 在第一次转换(如果有)完成之前发生故障。
这意味着对于以下输入:
4 20 23
52 65 er
96 96 82
你会得到:
Intigers scanned are 4 20 23
Input mismatch
&安培;对
4 20 23
52 65 96
er 96 82
你会得到:
Intigers scanned are 4 20 23
Intigers scanned are 52 65 96
Input mismatch
所以:
它确实是一个数字而不是7jho或ad841
得到了解答。
附加变量d
是为了防止环绕以获取输入。所以输入
4 20 23
65 96
96 96 82
会给你:
Intigers scanned are 4 20 23
Input mismatch
变量d
在某种意义上强制执行严格的输入,代价是字节空间。
所以
它真的得到了所有3个而不仅仅是2例如
得到了解答。