问题描述
当我初始化像 char str1[] = {'a','b','c'}
这样的字符数组(未设置数组大小)并使用循环找到它的长度直到 str1[i] != '\0'
时,我得到 length = 4
。相反,当我像 char str2[10] = {'a','c'}
一样初始化(设置数组大小)并使用相同的方式找到长度时,我得到 length = 3
。为什么 str1[3]
包含垃圾值但在 str2[3]
中没有?
解决方法
char str1[] = {'a','b','c'};
创建一个包含 3 个字符的数组,其值为 'a'
、'b'
和 'c'
。数组的大小为 3,您可以使用 sizeof str1
看到(这会返回字节数,但由于 char
被定义为 1 个字节,因此它与元素数相同)。尝试计算此数组中包含的字符串的长度会导致未定义行为,因为 str1
确实不包含 C 样式字符串,因为它没有 {{ 1}} 终止符。您的循环计算超出了数组的范围。
'\0'
创建一个包含 10 个字符的数组,其值为 char str2[10] = {'a','c'};
、'a'
、'b'
和 7 个 'c'
。数组的大小是 10。计算 '\0'
中字符串的长度会得到 3,因为 str2
是 str2[3]
;
如果你想创建一个包含 C 风格字符串的数组而不指定大小,你可以执行 '\0'
,或者更简单的,char str[] = {'a','c','\0'};
。