在C语言中将数字从标准输入读入并存入数组

4

我正在尝试从标准输入中获取数字并将其存入数组中。标准输入中的第一个数字是数组中元素的数量(该数字可以是任何整数)。 我使用以下代码获取第一个数字:

while(c=getchar()!=' '){
n*=10;
n+=atoi(c);
}

然后创建一个大小为n的数组。现在我需要遍历所有剩余元素。

 while(c=getchar()!=EOF)

并向数组中添加数字。这些数字由 \t 和有时也有 \n 分隔。 我该怎么做呢?我已经思考了一个小时,但仍然没有可用的代码。 需要帮忙吗? 谢谢!

1个回答

4

除非你特别喜欢折磨自己(或者因为作业要求而不得不这样做),否则通常会使用scanf来完成:

int n;
int *numbers;

scanf("%d", &n);

numbers = malloc(n * sizeof(*numbers));

for (int i=0; i<n; i++)
    scanf("%d", &numbers[i]);

为了更加健壮的错误处理,您经常需要使用fgets一次读取一行,然后使用sscanf(或类似的工具)将其解析为单独的数字。
顺便说一句:不要将malloc的返回值强制转换为int *。在C语言中既不必要也不可取。只需要#include <stdlib.h>并按上述示例分配结果即可。如果编译器提示您有关转换的警告(或错误),则意味着发生了两件事情之一:要求您忘记了必须包含#include <stdlib.h>,否则您实际上正在作为C++进行编译。如果您正在编写C ++,请按真正的C ++方式进行编写,这意味着您根本不应该使用malloc

哇,我不知道我可以做到这个!但是,你能解释一下为什么数字之间的任何内容都被忽略吗?第二个scanf如何从第一个scanf停止的地方继续执行? - MinaHany
@MinaHany:是的,%c会读取空格。实际上,%c和%s之间的根本区别在于,%s跳过前导空格,然后读取到下一个空格,而%c只读取您指定的字符数。 - Jerry Coffin
如果在标准输入(stdin)中输入了 "StringA StringB StringC",那么使用 scanf %s 将自动读取 3 个字符串并忽略空格,但是 scanf %c 将逐个读取字符。谢谢!祝您有愉快的一天 :) - MinaHany
@MinaHany:%c 会一个一个地读取,但你也可以指定数量,所以 %26c 一次可以读取所有的 "StringA StringB StringC"(至少如果我数对了的话)。 - Jerry Coffin
非常感谢您提供额外的信息!朋友,干杯 - MinaHany
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接