我声明了一个静态字符数组,然后将它传递给一个函数。怎么拿号。函数内部数组中的字节数?
7 回答
使用具有非类型模板参数的函数模板:
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);
这个函数的一个新副本将被实例化为每个不同大小的数组,所以如果你用许多不同大小的数组调用它,你会得到一些代码膨胀。但情况并非如此。
您必须将其传递给函数。您可以使用 sizeof() 来获取数组的大小。
const char foo[] = "foobar";
void doSomething( char *ptr, int length)
{
}
doSomething(foo, sizeof(foo));
这个MSDN 页面解释了更多关于 sizeof 并有一个更大的例子。
编辑:*请参阅 j_random_hacker 的答案,了解使用模板的有趣技术... *
您也可以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;
}
你不能。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*,您都不知道大小。
我建议将大小作为单独的参数传递。
不,不要使用数组。请改用向量。现在几乎没有理由使用数组,因为它们不安全。AFAIK,它们是软件问题的主要原因之一,因为很容易意外地超出阵列的末端。
使用向量,您不必再担心缓冲区溢出。你的函数可以很容易地找出向量的大小。
#include <vector>
vector<char> myVector;
void DoSomething(vector<char> &v)
{
int sizeOfVector = v.size();
}
int array_size = sizeof(Array) / sizeof(Array[0]);
您还有一个选择是创建一个管理字符串的字符串类。我敢肯定有人已经这样做了。最原始的版本是带有 char * 和缓冲区长度的结构,当它发生变化时,您必须手动管理大小。频谱的另一端是一个完全实现的字符串类,具有运算符重载和操作功能。
然后将此类传递给您的函数,它已经知道大小。将它作为单独的参数传递并没有什么不同;如果它们都是不同的长度,它只是一种更简单的管理字符串的方法。