将数字从标准输入获取到 C 中的数组

Posted

技术标签:

【中文标题】将数字从标准输入获取到 C 中的数组【英文标题】:getting numbers from stdin to an array in C 【发布时间】:2012-04-08 07:03:47 【问题描述】:

我正在尝试将数字从标准输入获取到数组。 stdin 中的第一个数字是数组中元素的数量(数字可以是任何 int)。 我这样做是为了得到第一个数字:

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

然后创建了一个大小为 n 的数组。 现在我需要完成所有其余的工作

 while(c=getchar()!=EOF)

并将数字添加到数组中。数字由 \t 分隔,有时也由 \n 分隔。 我该怎么做?我已经思考了一个小时,但仍然没有工作代码。 有什么帮助吗? 谢谢!

【问题讨论】:

【参考方案1】:

除非你感觉特别受虐(或者由于作业要求不能),你通常会使用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 &lt;stdlib.h&gt;,并按上图所示分配结果。如果您的编译器向您发出有关转换的警告(或错误),则表示正在发生以下两种情况之一:要么您忘记了#include &lt;stdlib.h&gt;,要么您实际上正在编译为 C++。如果您正在编写 C++,请编写真正的 C++,这意味着您根本不应该使用 malloc

【讨论】:

哇,我不知道我能做到这一点!但是,您能否解释一下,为什么数字之间的任何内容都被忽略了?第二个 scanf 如何从第一个 scanf 停止的地方继续? "%d" scanf 转换会跳过数字前的空白(制表符和换行符都被视为空白)。当您打开一个文件时,它有一个“当前位置”指示器,该指示器由从中读取的函数更新(getcscanffread 等) 但在 %c 的情况下,空格是否正确?啊,是的,我知道当前位置,但不知道 scanf 也使用它。 @MinaHany:是的,%c 会读取空格。事实上,%c 和 %s 之间的根本区别在于 %s 会跳过前导空格,然后读取到下一个空格,其中 %c 只读取您指定的多个字符。 所以如果在标准输入上是 "StringA StringB StringC" 那么 scanf %s 将自动读取 3 个字符串并忽略空格,但 scanf %c 将一个一个读取字符。非常感谢你,伙计!祝你有美好的一天:)

以上是关于将数字从标准输入获取到 C 中的数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在C语言中不指定数组大小的情况下将数字读入数组

为啥使用 getline 从标准输入获取大量输入会截断我的输入?

C语言,程序读取标准输入是啥意思?

C 低级标准输入以接受文件名,然后将文件内容打印到标准输出

从标准输入获取数字列表并标记它们

从线程中的标准输入读取以写入 c 中的文件