我有以下形式的代码:
void arrLen(char* array){
// print length
}
int main(){
char bytes[16];
arrLen(bytes);
}
我需要做的是获取底层数组的长度并将其打印出来。问题是数组可能包含NULL CHARACTERS,因此strlen
不起作用。有没有办法做到这一点,或者我必须将其作为char[]
而不是char*
传递?
答案 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了解演示。
使用数组的替代方法:
std::string
;这些可以包含NULL字符:
std::string s("hello\0world", 11);
boost::array<char, 16>
(在C ++ 11中以std::array<char,16>
提供,或在市场上的大多数每个C ++编译器中都为std::tr1::array
)答案 2 :(得分:2)
在传统方式(C)中,必须将大小作为函数的属性传递
void arrLen(char* array, int maxSize){
// print length
}
int main(){
char bytes[16];
arrLen(bytes, 16);
}
答案 3 :(得分:1)
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])