在下面的这段代码中,循环必须在第4个值处结束,因为它是循环的结束,但取而代之的是,它开始使用甚至不遵循循环条件即100的值,甚至不停止..当我输入一个printf语句来测试它时,我就知道了这一点,然后发现它在a [i]中使用100是不可能的。
#include <stdio.h>
#include <string.h>
#include <math.h>
int main()
{
int n,i,m;
i=0;
char a[i];
printf("how many characters you want to enter=");
scanf("%d",&n);
for (i=1;i<=n;i++)
{
scanf(" %c",&a[i]);
printf("%d\n",i);
//now this loop is not stopping//
}
for (i=1;i<=n;i++)
{
printf("%c \t",a[i]);
}
}
输出:-
how many characters you want to enter=4
a
1
b
2
c
3
d
100
e
101
答案 0 :(得分:0)
i=0;
char a[i];
是undefined behavior,所以错误。您应该分配一个非空数组automatic variable,或者最好谨慎使用C dynamic memory allocation
阅读Modern C,请参阅this C reference,C编译器(例如GCC ...)和调试器(例如GDB ...)的文档。在使用每个标准功能(例如of scanf
)之前,请务必先阅读该文档。请注意,scanf
可能会失败并返回您应该测试的有趣整数。
如果您使用GCC,请编译with所有警告和调试信息,因此gcc -Wall -Wextra -g
答案 1 :(得分:0)
...
//now this loop is not stopping//
...
输出:-
... d 100 e 101
此(未定义)行为是由于错误大小为0的数组写出的结果, i 在输入“ d”后变为100,然后在输入“ e”后变为101,因为ASCII码为d和e分别是100和101。
正如我在讲话中所说:
i=0;; char a[i];
声明一个包含0个元素的数组。做scanf("%d",&n);char a[n];
使其具有大小。数组的第一个索引为0,而不是1,因此将for (i=1;i<=n;i++)
替换为for (i=0;i<n;i++)
。我也建议您检查scanf("%d",&n);
返回1,并且 n 是肯定的
所以我不明白你为什么回答:
这行不通,我已经尝试过了
除非您错过了我的评论中的至少一项更正,因为我按照我说的做:
#include <stdio.h>
int main()
{
int n;
printf("how many characters you want to enter=");
if ((scanf("%d",&n) != 1) || (n < 1))
puts("invalid size");
else {
char a[n];
int i;
for (i=0; i<n; i++)
{
scanf(" %c",&a[i]);
printf("%d\n",i);
}
for (i=0; i<n; i++)
{
printf("%c \t",a[i]);
}
putchar('\n');
}
return 0;
}
编译和执行:
pi@raspberrypi:/tmp $ gcc -Wall cc.c
pi@raspberrypi:/tmp $ ./a.out
how many characters you want to enter=4
a
0
b
1
c
2
d
3
a b c d
pi@raspberrypi:/tmp $