繁体   English   中英

在C中使用不同的数值获得相同操作的不同长度

[英]Getting different lengths for the same operation with different number values in C

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

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似乎毫无意义,因为您已经知道这些数组中的项目数。)

使用strlen ,char数组必须以nul终止-但是您的数组不是,因此您有未定义的行为。

要打印数组的大小,请尝试:

printf("UPPERCASE = %zu\n", sizeof uppercase);
printf("LOWERCASE = %zu\n", sizeof lowercase);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM