Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 获取作为字符传递后数组的长度*_C++_Arrays_Pointers_Char - Fatal编程技术网

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++ 11中使用,或在市场上的大多数C++编译器中)
    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])