在C中读取多个多行数(未指定数量)

时间:2016-10-27 18:02:31

标签: c linux

我需要创建一个带有两行输入的程序,每行输入一个未指定数量的数字,并将每个输入存储在一个单独的向量中(int *)。

不允许使用字符串存储输入,然后将其转换为int。

它必须在linux环境中工作,实际上我已经使用以下代码解决了它的问题:

int t,s1=0,s2=0;
char tx;
int* a=(int*)malloc(0);
int* b=(int*)malloc(0);
scanf("%i%c",&t,&tx);
while(tx!='\n')
{
    a=(int*)realloc(a,sizeof(int)*(s1+1));
    a[s1++]=t;
    scanf("%i%c",&t,&tx);
}
a=(int*)realloc(a,sizeof(int)*(s1+1));
a[s1++]=t;
scanf("%i%c",&t,&tx);
while(tx!='\n')
{
    b=(int*)realloc(b,sizeof(int)*(s2+1));
    b[s2++]=t;
    scanf("%i%c",&t,&tx);
}
b=(int*)realloc(b,sizeof(int)*(s2+1));
b[s2++]=t;

我已经在linux上测试了它,至少在我看来,它没有用。

非常感谢你的帮助,非常感谢你!

1 个答案:

答案 0 :(得分:3)

我在linux上试过你的程序,对我来说,它很有用。我使用了以下输入文件:

1 2 3
4 5

我在gdb中运行它并在最终语句之后,调试器给出了以下值:

(gdb) print s1
$4 = 3
(gdb) print s2
$5 = 2
(gdb) print a[0]
$6 = 1
(gdb) print a[1]
$7 = 2
(gdb) print a[2]
$8 = 3
(gdb) print b[0]
$9 = 4
(gdb) print b[1]
$10 = 5
(gdb) 

但是如果输入数据中有尾随空白,代码可能会失败。

您也不检查scanf()的返回值,因此如果scanf()失败,它可能会进入无限循环,例如由于早期的EOF。

如果使用Windows行结尾(\ r \ n)从文件中提供程序输入数据,也可能会遇到问题。

我也建议使用do {} while (tx!='\n')循环,因为它消除了重复的代码。