14

我声明了一个静态字符数组,然后将它传递给一个函数。怎么拿号。函数内部数组中的字节数?

4

7 回答 7

36

使用具有非类型模板参数的函数模板:

template <size_t N>
void func(char (&a)[N]) {
    for (int i = 0; i < N; ++i) {
        cout << "a[" << i << "] = " << a[i] << endl;   // Or whatever you want to do
    }
}

致电:

char myArray[500];        // Or "static char myArray[500]", if you want
func(myArray);

这个函数的一个新副本将被实例化为每个不同大小的数组,所以如果你用许多不同大小的数组调用它,你会得到一些代码膨胀。但情况并非如此。

于 2009-01-17T10:56:32.890 回答
14

您必须将其传递给函数。您可以使用 sizeof() 来获取数组的大小。

const char foo[] = "foobar";

void doSomething( char *ptr, int length)
{

}


doSomething(foo, sizeof(foo));

这个MSDN 页面解释了更多关于 sizeof 并有一个更大的例子。

编辑:*请参阅 j_random_hacker 的答案,了解使用模板的有趣技术... *

于 2009-01-17T10:29:48.153 回答
4

您也可以std::size()从 C++17 开始使用

https://en.cppreference.com/w/cpp/iterator/size

#include <iostream>
#include <vector>
#include <iterator>

int main() 
{
    std::vector<int> v = { 3, 1, 4 };
    std::cout << std::size(v) << '\n'; 

    int a[] = { -5, 10, 15 };
    std::cout << std::size(a) << '\n';
}

对于 c++17 之前的复制示例实现;)

template <class T, std::size_t N>
constexpr std::size_t size(const T (&array)[N]) noexcept
{
    return N;
}
于 2018-08-09T07:58:49.097 回答
1

你不能。C++ 中的数组是指针,这就是你所拥有的:指向数组开头的指针。如果它恰好是一个字符串,你可以使用 strlen 来测量它的长度。如果是其他已知格式,您可以根据该格式计算长度。

考虑这段代码:

static char str[] = "hello world";

foo(str);
bar(str);

void foo(char* str)
{
   // length of str is unknown
}

void bar(char str[])
{
  // length of str is still unknown
}

无论您的函数参数是 char[] 还是 char*,您都不知道大小。

我建议将大小作为单独的参数传递。

于 2009-01-17T10:32:19.053 回答
1

不,不要使用数组。请改用向量。现在几乎没有理由使用数组,因为它们不安全。AFAIK,它们是软件问题的主要原因之一,因为很容易意外地超出阵列的末端。

使用向量,您不必再担心缓冲区溢出。你的函数可以很容易地找出向量的大小。

#include <vector>
vector<char> myVector;

void DoSomething(vector<char> &v)
{
    int sizeOfVector = v.size();
}
于 2009-01-17T10:58:06.240 回答
1

int array_size = sizeof(Array) / sizeof(Array[0]);

于 2009-11-20T13:40:46.243 回答
0

您还有一个选择是创建一个管理字符串的字符串类。我敢肯定有人已经这样做了。最原始的版本是带有 char * 和缓冲区长度的结构,当它发生变化时,您必须手动管理大小。频谱的另一端是一个完全实现的字符串类,具有运算符重载和操作功能。

然后将此类传递给您的函数,它已经知道大小。将它作为单独的参数传递并没有什么不同;如果它们都是不同的长度,它只是一种更简单的管理字符串的方法。

于 2009-01-17T10:38:46.483 回答