我使用命令行将文本文件输入到程序中,该程序使用文件中的信息显示其他值,以表示该文本文件中的内容。
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)
,但它似乎无法发挥作用。
答案 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
并检查以确保它小于COUNT或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;
}
}