【问题标题】:How to check the behavior of fscanf in c?如何检查 c 中 fscanf 的行为?
【发布时间】:2015-12-12 14:52:14
【问题描述】:

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

我将如何检查是否:

  • 它真的得到了所有 3 个,而不仅仅是 2 个,例如
  • 它实际上是一个数字,而不是像 7jho 或 ad841 之类的东西

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

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

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

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

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

对吗?

【问题讨论】:

  • 一个好的开始可能是看看fscanf description
  • 我做到了,但我忘了提到该函数返回 1,即使它成功扫描了所有 3 个数字。我知道确实如此,因为我后来在项目中与他们合作。
  • 输入文件来自哪里,您使用的是什么操作系统?
  • 该文件是一个 .txt 文件,我用 fopen 打开它以供阅读。它与我的程序位于同一目录中。我在窗户上。
  • 请把代码sn-p贴出来好吗?

标签: c text-files scanf


【解决方案1】:

scanf 系列函数(man scanf)的手册页明确指出,返回值是分配的输入元素的数量。

如果返回的数字大于零,则它等于根据指定转换读取的元素数。如果数字为 0,那么即使有要读取的元素,如果它们与转换不匹配,也不会分配任何人,就像您指定 %d 但随后在读取时遇到一个字母的情况一样。在文件结尾等输入失败的情况下返回EOF。

因此,fscanf 可以完成您想要的所有工作,您只需检查返回的项目数。 如果您期望 3 个整数,则当且仅当 fscanf 读取 3 个整数值时,它才会返回 3。

一般来说,要检查一个数字,我建议使用函数 isdigit()。

【讨论】:

    【解决方案2】:

    我不确定这段代码是否万无一失,但这只是一个尝试:

    #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 个

    已回答。

    【讨论】:

    • 感谢您提供这段代码!但是,我正在扫描 3 个字符串,但它仍然说 fscanf 的值是 1,即使它们都被扫描了。
    • 为什么要将它们扫描为字符串,然后使用atoi 左右转换为整数或浮点数?当您可以通过一些错误检查直接存储这些数字时,这没有多大意义。
    • 我不确定。我在想,可能是因为数字零? if(atoi(char) == 0 && char[0] != '0'){return 0;}
    猜你喜欢
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    相关资源
    最近更新 更多