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

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

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

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

 while(c=getchar()!=EOF)

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

【问题讨论】:

    标签: arrays getchar atoi


    【解决方案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 将一个一个读取字符。非常感谢你,伙计!祝你有美好的一天:)
    猜你喜欢
    • 2015-05-28
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多