c++ - const char * 数组中的元素数

我用 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/

相关文章:

r - 如何创建一个虚拟变量对应于 R 中值的变化

c++ - 为什么移动 vector 不触发移动内部元素?

rust - 为什么使用盒装对象而不是特征对象?

python - 从列表中删除不重复的值

javascript - 'submit' 事件产生的 SubmitEvents 是否包含表单值?

python - 如何重构此代码片段以使其更高效?

awk - 如果模式存在于另一列中,则从该列中移除模式

r - 字母序列到数字序列 R

r - 有没有一种简单的方法可以用 R 制作水平单层堆叠条形图?

r - 如何在数据帧的特定索引中插入行,其中仅在 R pipe dplyr 中包含上面几行的总和