我声明了一个静态字符数组,然后将它传递给一个函数。怎么得到没有。函数内部数组中的字节数?
答案 0 :(得分:33)
使用具有非类型模板参数的函数模板:
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);
此函数的新副本将针对调用它的每个不同大小的数组进行实例化,因此如果使用许多不同大小的数组调用它,您将获得一些代码膨胀。但情况可能并非如此。
答案 1 :(得分:14)
您必须将其传递给该函数。您可以使用sizeof()来获取数组的大小。
const char foo[] = "foobar";
void doSomething( char *ptr, int length)
{
}
doSomething(foo, sizeof(foo));
这个MSDN page更多地解释了sizeof,并有一个更大的例子。
编辑:* see j_random_hacker's answer了解使用模板的有趣技巧...... *
答案 2 :(得分:3)
没有。不要使用数组。请改用矢量。这些天几乎没有理由使用数组,因为它们不安全。 AFAIK,它们是软件问题的主要原因之一,因为很容易意外地超出阵列的末尾。
使用向量,您不必再担心缓冲区溢出。而且你的功能可以很容易地找出vecor的大小。
#include <vector>
vector<char> myVector;
void DoSomething(vector<char> &v)
{
int sizeOfVector = v.size();
}
答案 3 :(得分:2)
int array_size = sizeof(Array)/ sizeof(Array [0]);
答案 4 :(得分:2)
您还可以在C ++ 17中使用std::size()
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;
}
答案 5 :(得分:0)
你做不到。 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 *,你都不知道它的大小。
我建议将大小作为单独的参数传递。
答案 6 :(得分:0)
另一个选项是创建一个管理字符串的字符串类。我相信那里的人已经做到了。最原始的版本是带有char *和缓冲区长度的结构,您必须在每次更改时手动管理大小。频谱的另一端是完全实现的字符串类,具有运算符重载和管理功能。
然后将此类传递给您的函数,它已知道大小。然后将它作为单独的参数传递并没有任何不同;如果它们的长度不同,它只是一种管理字符串的简单方法。