如果文件中输入的值为空,scanf会发生什么?

时间:2016-11-18 15:49:28

标签: c input scanf

我使用命令行将文本文件输入到程序中,该程序使用文件中的信息显示其他值,以表示该文本文件中的内容。

test.exe< input.txt(命令行)

文件如下所示:

  

2
  abc 123
  qwe 456

2号告诉我程序必须阅读多少内容。 (在代码中命名为COUNT)

double number[MAXVALUE];
char name[MAXVALUE][MAXLENGTH];    
for(i = 0; i < COUNT; i++)
    {
        scanf("%s %lf", name[i], &number[i]);
    }

这是输入代码的样子。

现在,如果我将3作为COUNT,程序将尝试读取3行并将第3行显示为乱码。 如果输入的值不存在,我该如何阻止scanf运行?

我累了if(scanf(....) != 1),但它似乎无法发挥作用。

2 个答案:

答案 0 :(得分:3)

首先,避免调用未定义的行为 %lf用于阅读double,而不是int

然后,scanf()的返回值对于检查读取是否成功非常有用。

引自N1570 7.21.6.4 scanf函数,第3段:

  

如果输入,scanf函数返回宏EOF的值   在第一次转换(如果有)完成之前发生故障。   否则,scanf函数返回输入项的数量   分配,可以少于提供,甚至为零   早期匹配失败的事件。

以下是改进代码的示例:

double number[MAXVALUE];
char name[MAXNAME][MAXLENGTH];    
for(i = 0; i < COUNT; i++)
    {
        if (scanf("%s %lf", name[i], &number[i]) != 2)
            {
                fputs("read error\n", stderr);
                exit(1); /* stdlib.h should be included to use this */
            }
    }

答案 1 :(得分:1)

只要扫描了两个项目,就使用while循环进行迭代。递增i并检查以确保它小于COU​​NT或MAXVALUE。然后,i将在数组中完成元素的数量。

double number[MAXVALUE] = {0.0};
char name[MAXVALUE][MAXLENGTH] = {{ '\0'}};
int i = 0;
while ( ( scanf("%s %lf", name[i], &number[i])) == 2)
{
    i++;
    if ( i >= COUNT || i >= MAXVALUE)
    {
        break;
    }
}