将数字从标准输入获取到 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 <stdlib.h>
,并按上图所示分配结果。如果您的编译器向您发出有关转换的警告(或错误),则表示正在发生以下两种情况之一:要么您忘记了#include <stdlib.h>
,要么您实际上正在编译为 C++。如果您正在编写 C++,请编写真正的 C++,这意味着您根本不应该使用 malloc
。
【讨论】:
哇,我不知道我能做到这一点!但是,您能否解释一下,为什么数字之间的任何内容都被忽略了?第二个 scanf 如何从第一个 scanf 停止的地方继续? "%d" scanf 转换会跳过数字前的空白(制表符和换行符都被视为空白)。当您打开一个文件时,它有一个“当前位置”指示器,该指示器由从中读取的函数更新(getc
、scanf
、fread
等)
但在 %c 的情况下,空格是否正确?啊,是的,我知道当前位置,但不知道 scanf 也使用它。
@MinaHany:是的,%c 会读取空格。事实上,%c 和 %s 之间的根本区别在于 %s 会跳过前导空格,然后读取到下一个空格,其中 %c 只读取您指定的多个字符。
所以如果在标准输入上是 "StringA StringB StringC" 那么 scanf %s 将自动读取 3 个字符串并忽略空格,但 scanf %c 将一个一个读取字符。非常感谢你,伙计!祝你有美好的一天:)以上是关于将数字从标准输入获取到 C 中的数组的主要内容,如果未能解决你的问题,请参考以下文章