c - 为 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','.','.','.'}
) 分配它也没有关系。
有人对这种奇怪的行为有解释吗?
解决方案
getLength
很好,但如果我是你,我会使用size_t
类型作为长度。
char test1[7] = "BlaBlaB"
没有为NUL
终止符提供空间,您需要 char test1[8]
,或者更好的是,将数字留在外面,让编译器为您解决。也可以这样说test2
,尽管在这种情况下,r 值中没有隐式NUL
终止符,因此如果您对char[]
类型声明的那种极其繁琐的语法感到厌烦,则需要自己添加它。
test3
很好,因为你提供了足够的空间NUL
。
运行超过数组末尾的test1
行为test2
是undefined。这就解释了奇怪之处。有时程序行为可能与您的期望一致。在其他情况下,尽管编译器可能会吃掉你的猫。
推荐阅读
- arrays - Powershell,根据同一CSV中的其他字段修改CSV字段
- javascript - 钩子在内部是如何实现的?
- node.js - 更新 Paypal 上的自定义字段
- python - 在 Python 中使用退出或退出?
- hibernate - Hibernate的Jhipster实体中的复合主键
- flutter - TextField 的光标在 iOS 中无法正常工作。(在 Android 中运行良好)
- android - 你如何选择Android中的起始文件?
- java - 使用 Eclipse IDE 的 Java 代码问题(初级程序员)
- rss - dpdk19.11 ixgbe rx 队列增加到 22 没有生效,
- oracle - 一旦一个分支在 oracle apex 20.1 中无法执行后执行了其他分支