从输入中获取未知的数字长度

时间:2014-11-24 05:54:30

标签: c input

当我按下键盘上的 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

的元素

2 个答案:

答案 0 :(得分:6)

首先,大量的赞誉用于测试来自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;
}

答案 1 :(得分:0)

检查以下代码:

#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;
    }