C编程:Array自己打印两个字符

时间:2017-05-02 05:58:17

标签: c arrays string

我正在尝试打印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

2 个答案:

答案 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};
  • 或者,手动为null终止您的数组,例如arraytwo[2] = '\0';

将数组用作 string

答案 1 :(得分:2)

你在制作长度为3的阵列方面做得很好。但你没有将它初始化为全0。因此,在剪切开始时,数组包含一些随机垃圾,在数组之后也会出现一些随机的东西。

当您将指针传递给printf("%s")函数调用时,printf将输出以指向值开始的内存并递增指针,直到它到达'\0'

在你的情况下,这已经发生在2个随机字符之后。但它没有必要。如果你的打印电话的随机部分中也存在铃声响起的字符(我认为它是'\b'),那么你的电脑甚至可能会发出哔哔声。