4

可能重复:
C 编程语言中数组的大小?

我有以下形式的代码:

void arrLen(char* array){
    // print length
}

int main(){
    char bytes[16];
    arrLen(bytes);
}

我需要做的是获取底层数组的长度并将其打印出来。问题是数组可能包含空字符,因此strlen无法工作。有什么办法可以做到这一点,还是我必须将它作为 achar[]而不是 a传递char*

4

6 回答 6

6

C 风格的数组不携带长度信息。

您有几种可用的解决方案:

将数组的大小传递给您的函数:

void arrLen(char* array, std::size_t size)

如果您有权访问 C++ 11(或评论中提到的 TR1),请使用std::array

 std::array<char, 16> bytes;

如果您无权访问 std::array,则可以使用boost::array。它们大致相当于标准的。

关于你的评论

我是否必须将其作为 char[] 而不是 char* 传递?

数组总是作为指针传递给函数,所以void arrLen(char* array)void arrLen(char[] array)是等价的。

于 2013-01-04T14:47:05.783 回答
3

还是我必须将其作为 char[] 而不是 char* 传递?

将声明更改为arrLen()采用类型参数char[]而不是char*不会有任何效果,因为在这种情况下它们是等效的。

一个可能的解决方案是使用一个template函数:

#include <iostream>

template <typename T, int N>
void array_size(T (&a)[N])
{
    std::cout << N << "\n";
}
int main()
{
    array_size("hello");
    char bytes[16];
    array_size(bytes);
    return 0;
}

有关演示,请参见http://ideone.com/l7GxDp

使用数组的替代方法:

于 2013-01-04T14:46:36.040 回答
2

在传统方式 (C) 中,必须将大小作为函数的属性传递

void arrLen(char* array, int maxSize){
    // print length
}

int main(){
    char bytes[16];
    arrLen(bytes, 16);
}
于 2013-01-04T14:44:34.097 回答
1

C/C++ 中的数组不是这样处理的,你必须自己手动跟踪长度。将函数更改为类似的东西,void arrLen(char * array, int size)并在调用函数时指定大小。

于 2013-01-04T14:45:51.550 回答
1

如果您有 C++11,我建议您使用std::array,它会跟踪它的大小。

于 2013-01-04T14:47:53.783 回答
1

不幸的是,char[]参数char*类型是等价的。

你有两个选择:

将长度与指针一起传递,就像在 C 中一样:

void arrLen(char* array, size_t length)

或使用模板:

template<size_t sz>
void arrLen(char (&array)[sz])
于 2013-01-04T14:48:15.957 回答