C - 打印阵列

时间:2015-11-11 19:20:13

标签: c arrays printf

我正在尝试打印实时添加到数组中的元素 。

一切似乎都运转良好,但

例如

  

我添加数字1 2 3

但结果是: 9966656 2686588 1 2 3

我不知道为什么它会打印 9966656 2686588 ,而不仅仅是 1 2 3

    int numbers[100] , c , x;
    char answer;
    puts("Please insert a value");

GO:
    scanf("%d", &numbers[c]);
    getchar();
    puts("Do you want to add another value? y/n");
    scanf("%c",&answer);
    if (answer == 'y') {
        c = c + 1;
        puts("Please insert another value");
        goto GO;
    } else {
        x = c;

        for (c = 0; c < x + 1; c++) {
            printf("%d ",numbers[c]);
        }
    }

* =====================

如果您不了解某些内容,请与我们联系*

2 个答案:

答案 0 :(得分:1)

您需要解决几个问题。如果您使用警告已启用进行编译(例如,将-Wall -Wextra添加到您的编译字符串中),则所有这些内容都将为您编写。例如:

$ gcc -Wall -Wextra -o bin/go go.c

go.c: In function ‘main’:
go.c:17:5: warning: format ‘%c’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[30]’ [-Wformat=]
 scanf("%c",&answer);
 ^
go.c:18:15: warning: comparison between pointer and integer [enabled by default]
 if(answer == 'y')

如果您在代码编译之前解决了每个警告而没有出现警告,那么您将遇到主要问题:

for(c = 0; c < x + 1; c++)

x + 1会使您的循环读取超出数据的末尾。由于你 NOT 初始化numbers,它正在读取默认情况下存在的垃圾值。这是另一个好的教训:始终初始化变量

管理xc的方式也会遇到问题。 c只应在scanf读取的用户成功转换十进制时更新。 scanf提供了成功转化的数量。您需要使用返回来检查用户输入的有效小数,然后仅在转换成功后更新c(而不是用户输入y/n的结果。

稍微清理一下,你可以通过稍微重新安排你的逻辑来改善你的服务:

#include <stdio.h>

int main (void) {

    int numbers[100] = { 0 };
    int c = 0;
    int i = 0;
    char answer[30] = { 0 };

    printf (" Please insert a value: ");

GO:

    if (scanf ("%d", &numbers[c]) == 1)
        c++;
    getchar ();
    printf (" Do you want to add another value (y/n)? ");
    scanf ("%c", answer);
    if (*answer == 'y') {
        printf (" Please insert another value: ");
        goto GO;
    }

    for (i = 0; i < c; i++) {
        printf (" number[%2d] : %d\n", i, numbers[i]);
    }

    return 0;
}

<强>输出

$ ./bin/go
 Please insert a value: 10
 Do you want to add another value (y/n)? y
 Please insert another value: 11
 Do you want to add another value (y/n)? y
 Please insert another value: 12
 Do you want to add another value (y/n)? n
 number[ 0] : 10
 number[ 1] : 11
 number[ 2] : 12

(注意:我已将x更改为i - 感觉更为正常,以便迭代i

答案 1 :(得分:0)

由于c未初始化,您将其用作&#34; index&#34;行为未定义。 (&numbers[c])。这也可能导致分段错误甚至按照您的预期行事。

您需要做的是在一开始就将c设置为0。

另请尽量避免使用goto,除非有合理的理由使用它。