在为char数组实现getLength函数时,出现了一些奇怪的错误,具体情况如下

在为char数组实现getLength函数时,出现了一些奇怪的错误,具体情况如下,c,arrays,string,C,Arrays,String,我必须在不使用库函数的情况下实现一个确定字符串长度的函数。 我的函数如下所示: intgetLength(char strg[]){ 整数长度=0; while(strg[length]!='\0'){ 长度++; } 返回长度; } 用输入 chartest1[7]=“BlaBlaB” 以及 chartest2[8]={'B','l','a','B','l','a','B','l'} 函数返回值11和12,这当然是错误的 但是, chartest1[8]=“BlaBlaB” 或 cha

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

intgetLength(char strg[]){
整数长度=0;
while(strg[length]!='\0'){
长度++;
}
返回长度;
}
用输入

chartest1[7]=“BlaBlaB”
以及

chartest2[8]={'B','l','a','B','l','a','B','l'}
函数返回值11和12,这当然是错误的

但是,

chartest1[8]=“BlaBlaB”

chartest2[9]={'B','l','a','B','l','a','B','l'}
函数返回正确的结果

总之,只有当数组被分配了定义为允许容纳的元素数时,并且只有当元素数为7或8时,才会出现此错误。另外,如果我用字符串表示法(
“ab…”
)或数组表示法(
{'a','b','.','.','.'.','.'.}
)来分配值也没有关系


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

getLength
很好,不过如果我是你,我会使用
size\u t
类型来表示长度

char test1[7]=“BlaBlaB”
没有为
num
终止符提供空间,您需要char
test1[8]
或者,更好的是,省去数字,让编译器为您计算出来。对于
test2
,也可以这样说,尽管在这种情况下,r值中没有隐式的
NUL
终止符,因此,如果您对
char[]
类型声明的这种极其繁琐的语法着迷,您需要在自己身上添加它

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


运行超过数组
test1
test2
末尾的行为未定义。这就是奇怪的原因。有时,程序行为可能与您的期望一致。在其他情况下,编译器可能会吃掉你的猫。

getLength
很好,不过如果我是你,我会使用
size\u t
类型作为长度

char test1[7]=“BlaBlaB”
没有为
num
终止符提供空间,您需要char
test1[8]
或者,更好的是,省去数字,让编译器为您计算出来。对于
test2
,也可以这样说,尽管在这种情况下,r值中没有隐式的
NUL
终止符,因此,如果您对
char[]
类型声明的这种极其繁琐的语法着迷,您需要在自己身上添加它

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


运行超过数组
test1
test2
末尾的行为未定义。这就是奇怪的原因。有时,程序行为可能与您的期望一致。在其他情况下,编译器可能会吃掉你的猫。

chartest1[7]=“BlaBlaB”
没有
'\0'
字符。在
char test2[8]={'B'、'l'、'a'、'B'、'l'、'a'、'B'、'l'}
中也没有
'\0
字符。对于
test2
数组,显式填充所有元素,但不将任何元素设置为空终止符
'\0'
。现在考虑一下您的比较
strg[length]!='\如果数组中没有
'\0'
,0'
会起作用吗?@KamilCuk好的,但是为什么
test3[9]=“BlaBlaBla”
test4[6]=“BlaBlaBla”
会起作用呢?任何事情都可能发生。您正在允许的内存之外、数组之外读取,您的程序行为未定义。这可能有用。它可能不起作用。这不是一个“奇怪的错误”,因为无论是
char test1[7]=“BlaBlaB”
还是
char test2[8]={'B'、'l'、'a'、'B'、'l'、'a'、'B'、'l'}
都不会有一个
'\0'
终止符,因为您定义了它们,所以它们不会有
char test1[7]=“blab'、'l'、'a'、'a'、'B'、'l'、'a'、'B'、'B'、'l'}/code>字符。在
char test2[8]={'B'、'l'、'a'、'B'、'l'、'a'、'B'、'l'}
中也没有
'\0
字符。对于
test2
数组,显式填充所有元素,但不将任何元素设置为空终止符
'\0'
。现在考虑一下您的比较
strg[length]!='\如果数组中没有
'\0'
,0'
会起作用吗?@KamilCuk好的,但是为什么
test3[9]=“BlaBlaBla”
test4[6]=“BlaBlaBla”
会起作用呢?任何事情都可能发生。您正在允许的内存之外、数组之外读取,您的程序行为未定义。这可能有用。它可能不起作用。这不是一个“奇怪的bug”,因为无论是
char test1[7]=“BlaBlaB”
还是
char test2[8]={'B'、'l'、'a'、'B'、'l'、'a'、'B'、'l'}
都不会有一个
'\0'
终止符,因为您定义了它们,所以它们不会有。是的,我也宁愿使用非固定数组,但我需要解决的一个测试用例是
char test2[7]=“BlaBlaB”
或类似的东西,实际字符串在这里并不重要。我如何正确处理此测试用例?我如何检测此数组的结尾以返回其正确大小?@InterFelix In C是获取
test1
长度的唯一方法(或
test2
,如您在注释中所述)是使用
sizeof
运算符。但是这会得到整个数组的大小,而不是以null结尾的字符串的长度(而且它对指针不起作用)。如果您需要使用函数来获取字符串的长度,则不能使用不包含终止符的数组。如果您的老师要求您处理特定的情况,则您必须告诉他或她这是不可能的。@Someprogrammerdude,但我仍然不明白为什么它适用于