我正在尝试打印2个字符的字符串。这是该代码的一部分。
char arraytwo[3];
// 2 characters
for (i = 'a'; i <= 'z'; i++)
{
arraytwo[0] = i;
for (j = 'a'; j <= 'z'; j++)
{
arraytwo[1] = j;
printf("%s\n", arraytwo);
}
}
我得到的输出就是这个。由于某种原因,它在每次迭代结束时不断添加“AZ”。我错过了什么?
aaAZ abAZ acAZ adAZ aeAZ afAZ agAZ ahAZ aiAZ ajAZ akAZ
答案 0 :(得分:5)
您缺少的是字符串的定义,根据定义,它必须以空值终止。
引用C11
,章节§7.1.1,(强调我的)
string 是一个连续的字符序列由第一个null终止并包含 性格。 [....]
在您的情况下,arraytwo
,
因此,从技术上讲,arraytwo
不 字符串。
在此用法中,作为%s
格式说明符的参数,在搜索空终止符时会发生超出绑定的访问,从而导致undefined behavior。
同时引用章节§7.21.6.1
s
如果不存在
l
长度修饰符,则参数应为指向初始值的指针 字符类型数组的元素。 280) 数组中的字符是 写入(但不包括)终止空字符。 [....]
<强>解决方案:强>
0
,类似char arraytwo[3] = {0};
arraytwo[2] = '\0';
将数组用作 string 。
答案 1 :(得分:2)
你在制作长度为3的阵列方面做得很好。但你没有将它初始化为全0。因此,在剪切开始时,数组包含一些随机垃圾,在数组之后也会出现一些随机的东西。
当您将指针传递给printf("%s")
函数调用时,printf
将输出以指向值开始的内存并递增指针,直到它到达'\0'
。
在你的情况下,这已经发生在2个随机字符之后。但它没有必要。如果你的打印电话的随机部分中也存在铃声响起的字符(我认为它是'\b'
),那么你的电脑甚至可能会发出哔哔声。