在作为char传递后得到数组的长度*

时间:2013-01-04 14:40:31

标签: c++ arrays pointers char

  

可能重复:
  Sizeof an array in the C programming language?

我有以下形式的代码:

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

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

我需要做的是获取底层数组的长度并将其打印出来。问题是数组可能包含NULL CHARACTERS,因此strlen不起作用。有没有办法做到这一点,或者我必须将其作为char[]而不是char*传递?

6 个答案:

答案 0 :(得分: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)是等价的。

答案 1 :(得分: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了解演示。

使用数组的替代方法:

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

您有两种选择:

将长度与指针一起传递给C:

void arrLen(char* array, size_t length)

或使用模板:

template<size_t sz>
void arrLen(char (&array)[sz])