我正在尝试打印实时添加到数组中的元素 。
一切似乎都运转良好,但
例如
我添加数字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]);
}
}
* =====================
如果您不了解某些内容,请与我们联系*
答案 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
,它正在读取默认情况下存在的垃圾值。这是另一个好的教训:始终初始化变量。
管理x
和c
的方式也会遇到问题。 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
,除非有合理的理由使用它。