如何在c中检查fscanf的行为?

时间:2015-12-12 14:52:14

标签: c text-files scanf

我的fscanf函数应该从文件中获取3个数字并将它们存储在charr数组中,然后使用atoi和atof将其转换为int和float。

我如何检查是否:

  • 它真的得到了所有3个而不仅仅是2例如
  • 这是一个真正的数字而不是7jho或ad841

在第二种情况下,我认为只是测试将字符串转换为int / float是否成功就足够了

if(atoi(numberchar) == 0){printf("sorry error");}

但是,零是我的数字的有效值(浮点数和整数),所以我遇到了问题。

我还注意到,例如输入45kl,atoi / atof函数将其转换为45.所以这里唯一要注意的是输入不是以数字开头的?

为此,我可以写一个条件,如果数组的第一个元素不为零,但atoi / atof函数仍然失败(返回零),那么输入可能在开头有一个非数字字符。

是吗?

2 个答案:

答案 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例如

得到了解答。