可能重复:
C 编程语言中数组的大小?
我有以下形式的代码:
void arrLen(char* array){
// print length
}
int main(){
char bytes[16];
arrLen(bytes);
}
我需要做的是获取底层数组的长度并将其打印出来。问题是数组可能包含空字符,因此strlen
无法工作。有什么办法可以做到这一点,还是我必须将它作为 achar[]
而不是 a传递char*
?
可能重复:
C 编程语言中数组的大小?
我有以下形式的代码:
void arrLen(char* array){
// print length
}
int main(){
char bytes[16];
arrLen(bytes);
}
我需要做的是获取底层数组的长度并将其打印出来。问题是数组可能包含空字符,因此strlen
无法工作。有什么办法可以做到这一点,还是我必须将它作为 achar[]
而不是 a传递char*
?
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)
是等价的。
还是我必须将其作为 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>
(std::array<char,16>
在 C++11 中可用,或std::tr1::array
在市场上的大多数 C++ 编译器中可用)在传统方式 (C) 中,必须将大小作为函数的属性传递
void arrLen(char* array, int maxSize){
// print length
}
int main(){
char bytes[16];
arrLen(bytes, 16);
}
C/C++ 中的数组不是这样处理的,你必须自己手动跟踪长度。将函数更改为类似的东西,void arrLen(char * array, int size)
并在调用函数时指定大小。
如果您有 C++11,我建议您使用std::array,它会跟踪它的大小。
不幸的是,char[]
参数char*
类型是等价的。
你有两个选择:
将长度与指针一起传递,就像在 C 中一样:
void arrLen(char* array, size_t length)
或使用模板:
template<size_t sz>
void arrLen(char (&array)[sz])