【问题标题】:How do i return the size of char array with a function in c++?如何使用 C++ 中的函数返回 char 数组的大小?
【发布时间】:2019-04-23 11:45:10
【问题描述】:
void printsize(const char arr[]){
    cout<<"size is: "<<strlen(arr)<<endl;



}    
main(){

    char a[7] = {'a', 'b', 'c','d', 'c', 'b', 'a'};
    printsize(a)

    return 0
}

这是它的输出:size is 11

数组中没有任何地方是 11。 我应该怎么做才能使函数输出正确的大小,即 7?我不想设置 for 循环。

【问题讨论】:

  • strlen 用于以空字符结尾的字符串。您的 char 数组不包含 0 值,因此 strlen 会跑掉并停在内存中某处的第一个 0 处。
  • strlen / std::strlen 遵循以\0 结尾的chars 序列表示给定字符串的约定。您只是通过“机会”获得 11,实际上在未完成 \0 的数组上调用 strlen 会产生未定义的行为。 C/C++ 中的数组本身不保持长度,请查看 std::stringstd::array 以获得更高级的内容。
  • 有什么理由不使用std::array

标签: c++ arrays pointers char size


【解决方案1】:

你不能。只是来自const char arr[],它怎么知道数组的大小?一种解决方法可能是具有哨兵值。对于strlen,该标记值是字符串末尾的'\0'。将其添加到您的数组中:

char a[8] = { 'a', 'b', 'c','d', 'c', 'b', 'a', '\0' };

另外,函数中不存在a,您可能打算改用arr

std::cout << "size is: " << strlen(arr) << std::endl;

这将为您提供7 的预期输出。附带说明一下,您应该始终将您的main 函数声明为int main。不鼓励使用隐式 int 且不符合标准,并非所有编译器都支持它。

【讨论】:

    【解决方案2】:

    strlen 的前提条件是参数指向一个以空值结尾的数组(字符串)。您的数组不是以空值结尾的,因此您通过将该数组(指向)传递给strlen 来违反该先决条件。

    程序违反标准函数前提条件的行为是未定义的。

    如何用 c++ 中的函数返回 char 数组的大小?

    您可以使用模板获取数组的大小:

    template <class T, std::size_t N>
    std::size_t
    size(const T (&array)[N])
    {
        return N;
    }
    

    用法:

    char a[7] = {'a', 'b', 'c','d', 'c', 'b', 'a'};
    cout<<"size is: "<<size(a)<<endl;
    

    请注意,您不需要自己编写此模板,因为标准库已经为您提供了它。它被称为std::size(在 C++17 中引入)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-07
      • 1970-01-01
      • 2018-04-14
      • 1970-01-01
      • 2015-08-20
      • 2011-08-05
      • 1970-01-01
      • 2018-05-09
      相关资源
      最近更新 更多