【问题标题】:Get the unknown length of number from input [duplicate]从输入中获取未知长度的数字[重复]
【发布时间】:2014-11-24 05:54:30
【问题描述】:

我正在做一个需要输入数字列表并在我按键盘上的 Enter 时获得输出的作业。这是我尝试在输入时用于获取数字列表的代码,但它不起作用:

#include <stdio.h>

int main(){
    int arra[100];
    int i ;
    int j = -1;
    while (scanf("%d",&i) != 1){ 
        arra[++j] = i;
    }
    printf("\n");
    int k;
    for(k = 0; k < j; k++){
        printf("%d",arra[k]);
    }
    return 0;
}

我想打印arra的元素。

【问题讨论】:

  • 使用while (scanf("%d",&amp;i) == 1)
  • 我想在每次输入值时获取 arra[j] 的元素
  • 将此标记为与较新问题的重复,因为较新问题的答案实际上认为输入由 而不是 EOF 结束。

标签: c input


【解决方案1】:

首先,大量感谢测试来自 scanf 的返回值,大多数人只是盲目地认为它有效。可惜你以错误的方式使用它:-)

只要返回值为1,您就希望循环继续,这意味着您设法扫描了一个整数。这意味着它应该是:

while (scanf ("%d", &i) == 1) {

这也意味着任何非数字输入都会导致扫描失败,因此while 循环将退出。所以,如果你输入:

3 1 4 1 5 9 stop

您应该可以成功地看到数组中的数值。

唯一的另一件事是清理您的j 处理,因为k 循环将提前停止。这可以通过以下方式完成:

for (k = 0; k <= j; k++) {

或者,不理会该循环​​,只需更改初始化和修改 j 的方式:

int j = 0;
:
arra[j++] = i;

我倾向于发现第二个选择更像 C,因为 j 是数组中元素的计数,而不是最大索引。


而且,当然,您现在很容易受到缓冲区溢出攻击,因为您假设没有人会输入超过一百个数字。所以,不要把它用作家庭作业解决方案(你所拥有的已经足够好,只需修复一些小错误),但我倾向于将其写成:

#include<stdio.h>

#define SZ 100

int main (void){
  int arra[SZ], i, nxt = 0;

  while ((nxt < SZ) && (scanf ("%d", &(arra[nxt])) == 1))
    nxt++;
  printf ("\n");

  for (i = 0; i < nxt; i++)
    printf ("%d ", arra[i]);

  return 0;
}

【讨论】:

  • 为什么是k&lt;=j?应该是k&lt;j
  • @Gopi,这是因为 OP 从 -1 开始 j 并预递增,因此它最终以最高索引(count-1)而不是计数本身结束。
  • 好酷!你的代码看起来不错
  • 但我想在键盘上按 ENTER 后得到输出,而不是在输入字符时输出
  • @hellocomputer:如果你想知道用户什么时候点击返回,你不能使用scanf();它一点也不关心换行符。您需要读取一行输入,可能使用fgets(),然后使用sscanf() 迭代地解析该行。这有点难,但不是很难。您确实需要阅读 How to use sscanf() in loops 以了解如何知道在哪里恢复扫描。
【解决方案2】:

检查以下代码:

#include<stdio.h>

    int main(){
        int arra [100];
        int i ;
        int k;
        int j = 0; /* index from 0 */
        printf("Keep entering numbers and press q once done \n");
        while (scanf("%d",&i) == 1){ /* scan for integers */
         arra[j++] = i;
        }
        printf("\n");

        for(k = 0; k < j; k++){
            printf("%d",arra[k]);
        }
        return 0;
    }

【讨论】:

  • 当我在键盘上按 ENTER 时它仍然可以输入
  • @hellocomputer scanf() 在您输入字符而不是整数时失败。所以在输入所有数字后在最后输入 q
  • 谢谢,我可以用哪个来做
  • @hellocomputer 我没有收到你的问题so which can I use to do?
  • 对不起,我的意思是我可以使用哪个函数或方法来实现我的代码
猜你喜欢
  • 2016-03-11
  • 2017-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
相关资源
最近更新 更多