C++ 获取作为字符传递后数组的长度*
可能重复:C++ 获取作为字符传递后数组的长度*,c++,arrays,pointers,char,C++,Arrays,Pointers,Char,可能重复: 我有以下形式的代码: void arrLen(char* array){ // print length } int main(){ char bytes[16]; arrLen(bytes); } 我需要做的是获取底层数组的长度并将其打印出来。问题是数组可能包含空字符,因此strlen无法工作。有什么方法可以做到这一点,或者我必须将其作为char[]而不是char*传递吗?传统的方法是(C)必须将大小作为函数的属性传递 void arrLen(char
我有以下形式的代码:
void arrLen(char* array){
// print length
}
int main(){
char bytes[16];
arrLen(bytes);
}
我需要做的是获取底层数组的长度并将其打印出来。问题是数组可能包含空字符,因此strlen
无法工作。有什么方法可以做到这一点,或者我必须将其作为char[]
而不是char*
传递吗?传统的方法是(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)
的形式,并在调用函数时指定大小
或者我必须将其作为char[]而不是char*
将arrLen()
的声明更改为采用char[]
类型的参数而不是char*
将不会产生任何效果,因为在这种情况下,它们是等效的
一种可能的解决方案是使用模板
功能:
#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;
}
C样式数组不携带长度信息 您有几种可用的解决方案: 将数组的大小传递给函数:
void arrLen(char* array, std::size_t size)
使用,如果您有访问C++ 11(或在注释中提到的Tr1)< /P>
std::数组字节;
如果您无权访问std::array,则可以使用。它们大致相当于标准的
关于你的评论
我是否必须将其作为char[]而不是char*
数组总是作为指针传递给函数,因此
void arrLen(char*array)
和void arrLen(char[]array)
是等效的。如果您有一个C++11,我建议您使用,它会跟踪它的大小。不幸的是,char[]
和char*
参数类型是等效的
您有两个选择:
将长度与指针一起传递,就像在C中一样:
void arrLen(char* array, size_t length)
或使用模板:
template<size_t sz>
void arrLen(char (&array)[sz])
模板
无效数组(字符和数组)[sz])
在C语言中,数组并不是这样处理的。它们不是携带长度信息的实际对象。如果您可以访问C++11,请使用std::array。如果没有,您必须自己随时跟踪内存长度,为什么不直接使用vector
或array
?void arrLen(char*array,int size)@AK4749谢谢,但不幸的是,我没有访问c++11的权限。是否有一个boost模块可以执行此操作?@ewok确实:考虑到从C++11开始,std::array
是标准的,我希望在提到boost::array时也能看到对它的引用。@Agentlien,我知道,但OP在对问题的评论中指出C++11不可用。当然,但我还是要添加一条评论,可能在括号内。例如:boost::array(在C++11中作为std::array提供),这将有助于后面讨论这个问题的人,并且不受该限制。
void arrLen(char* array, size_t length)
template<size_t sz>
void arrLen(char (&array)[sz])