首页 > 解决方案 > 为 char 数组实现 getLength-Function 时出现特定情况的奇怪错误

问题描述

我必须在不使用库函数的情况下实现一个确定字符串长度的函数。我的功能如下所示:

int getLength(char strg[]) {
    int length = 0;

    while(strg[length] != '\0') {
        length++;
    }

    return length;
}

随着输入

char test1[7] = "BlaBlaB"

char test2[8] = {'B','l','a','B','l','a','B','l'}

该函数返回值 11 和 12,这当然是错误的。

然而,随着

char test1[8] = "BlaBlaB"

或者

char test2[9] = {'B','l','a','B','l','a','B','l'}

该函数返回正确的结果。

所以总结一下,只有在数组被分配的元素数量与定义允许容纳的数量一样多的情况下,并且只有元素数量为7或8时,才会出现此错误。此外,我是否使用字符串表示法 ( "ab...") 分配值或使用数组表示法 ( {'a','b','.','.','.'}) 分配它也没有关系。

有人对这种奇怪的行为有解释吗?

标签: carraysstring

解决方案


getLength很好,但如果我是你,我会使用size_t类型作为长度。

char test1[7] = "BlaBlaB"没有为NUL终止符提供空间,您需要 char test1[8],或者更好的是,将数字留在外面,让编译器为您解决。也可以这样说test2,尽管在这种情况下,r 值中没有隐式NUL终止符,因此如果您对char[]类型声明的那种极其繁琐的语法感到厌烦,则需要自己添加它。

test3很好,因为你提供了足够的空间NUL

运行超过数组末尾的test1行为test2undefined。这就解释了奇怪之处。有时程序行为可能与您的期望一致。在其他情况下,尽管编译器可能会吃掉你的猫。


推荐阅读