我正在用40个伪随机大写字母填充一个数组,然后将该数组转换为一个字符串,方法是在第41个元素处使用一个空字符终止它,但是当我执行后一种操作时,我的程序崩溃了。代码如下:
char s1[41];
int i;
for (i = 0; i < 41; i++)
{
s1[i] = ((rand() % 26) + 'A');
}
s1[i] = '\0';
puts(s1);
如果我在不使用null赋值语句的情况下一次打印出数组中的每个字符,则程序运行得很好,但是如果包含null赋值语句,则所有操作都会失败。我需要将数组转换为字符串,然后使用put函数。为什么会发生这种情况?字符串不只是一个以'\0‘(null)结尾的字符数组吗?是什么导致了这种情况?这是一个编译器错误吗?附件是错误消息的屏幕截图。
如果重要的话,我正在使用Microsoft Visual Studio Express 2013。
发布于 2015-04-28 19:46:39
为了澄清注释,如果您不清楚:退出循环后的i==41
,所以s1[i]
在数组的边界之外编写代码。这是未定义的行为,如前所述,您很幸运它崩溃了。
发布于 2015-04-28 19:53:23
我刚刚意识到我正在将空字符分配给数组之外的位置。我需要减少i。
发布于 2015-04-28 19:46:50
设置为41到40,然后重试
i < 40
通常,对这个数字进行试错可以得到不同的结果。
char s1[41];
int i;
for (i = 0; i < 40; i++)
{
s1[i] = ((rand() % 26) + 'A');
}
s1[i] = '\0';
puts(s1);
https://stackoverflow.com/questions/29928421
复制