我有2个for循环,用字母表中的字母填充数组。我有一个lowercase
数组和一个uppercase
数组。问题是当我用字母初始化数组时,长度会回来不同。
char uppercase[26];
char lowercase[26];
int indexUpper = 0;
int indexLower = 0;
// Get uppercase array:
for(int a = 65; a <= 90; a++){
uppercase[indexUpper] = a;
indexUpper++;
}
// Get lowercase array:
for(int b = 97; b <= 122; b++){
lowercase[indexLower] = b;
indexLower++;
}
printf("UPPERCASE = %lu\n", strlen(uppercase));
printf("LOWERCASE = %lu\n", strlen(lowercase));
$=> UPPERCASE = 26
$=> LOWERCASE = 27
如果这不是一件容易的事,我道歉。我真的想学习和理解C语言及其规则。感谢所有贡献者。
答案 0 :(得分:2)
strlen()
读取字符数组,直到找到NUL字节('\0'
,数值为零)。您的阵列不包含任何内容,因为您尚未在其中分配一个阵列。
这意味着strlen
将继续读取超过数组的结尾,这是非法的,并且导致的行为未定义。得到27是相当温和的,你可能得到任意数字,或者你的程序可能会崩溃。
如果你想使用strlen()
,你应该在字符串的末尾显式指定一个NUL字节,当然还要为它分配空间。
也许是这样的:
#include <stdio.h>
#include <string.h>
int main(void)
{
char upper[27];
int i;
for (i = 0 ; i < 26; i++) {
/* This only works in a character set where the letters
are contiguous */
upper[i] = 'A' + i;
}
/* i == 26 now */
upper[i] = '\0';
printf("len: %u\n", (unsigned) strlen(upper));
return 0;
}
(虽然在这里使用strlen
似乎有点无意义,因为你已经知道这些数组中的项目数。)
答案 1 :(得分:2)
当使用strlen
时,char数组必须才能终止 - 但是你的不是这样你有未定义的行为。
要打印数组的大小,请尝试:
printf("UPPERCASE = %zu\n", sizeof uppercase);
printf("LOWERCASE = %zu\n", sizeof lowercase);