我用 C 写了一个函数,它接受一个参数 const char *p
我想检查该数组中的元素数量,但效果不佳。
#include <stdlib.h>
#include <stdio.h>
int arrSize(const char *a){
int it = 0;
int size = 0;
while(a[it] != '\0'){
++size;
++it;
}
return size;
}
int main(){
const char a[5] = {'a', 'b', 'b', 'v', 's'};
const char b[4] = {'c', 'b', 'b', 'v'};
const char c[4] = {'c', 'b', 'b', 'v'};
printf("%d %d %d", arrSize(a), arrSize(b), arrSize(c));
}
但上面的代码给出了 8、12、16 的输出,我不知道为什么。
最佳答案
while(a[it] != '\0'){
当数组的元素等于空终止符时,此循环结束。
const char a[5] = {'a', 'b', 'b', 'v', 's'}; const char b[4] = {'c', 'b', 'b', 'v'}; const char c[4] = {'c', 'b', 'b', 'v'};
您的数组都不包含空终止符。循环不会在元素上停止,它会访问数组边界之外的不存在的元素,程序的行为是未定义的。这不好。不要这样做。
如果您向数组添加空终止符,则该函数将成功计算第一个空终止符之前的非空终止符字符数:
const char a[6] = {'a', 'b', 'b', 'v', 's', '\0'};
//const char a[] = "abbvs"; // equivalent
printf("%d", arrSize(a)); // 5
请注意,无需编写此 arrSize
,因为它由标准库以 strlen
的名称提供。
当您将指向数组元素的指针传递给函数时,没有通用的方法可以使用该指针确定数组的大小而不依赖于终止符值,例如在空终止字符串的情况下。
当函数需要访问任意长度的非终止数组时,一个常见的 C 习惯用法是将该大小作为参数传递给函数。现代 C++ 习惯用法是使用 std::span
或等同物,除了编译器可以推断数组的大小外,它们本质上是相同的。
您可以在声明数组的范围内确定数组变量的大小。一个常见的 C 习惯用法是用 sizeof
元素类型来划分 sizeof
数组。现代 C++ 习惯用法是使用 std::size
。示例:
const char a[5] = {'a', 'b', 'b', 'v', 's'};,
void operate_on_array(const char *arr, size_t size);
// C
operate_on_array(a, sizeof a / sizeof *a);
// C++ with std::size
operate_on_array(a, std::size(a));
// C++ with std::span
operate_on_array(std::span<const char> arr);
operate_on_array(a);
https://stackoverflow.com/questions/72124875/