使用C

时间:2017-11-28 19:48:50

标签: c arrays for-loop

我有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语言及其规则。感谢所有贡献者。

2 个答案:

答案 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);