如何在 C++ 中使用字符数组执行函数

问题描述 投票:0回答:2

问题是我不知道如何将 char[x][x] 发送到 void 我知道如何制作它们但不知道如何连接它们。

void thefunction(????????????????){ 
for(int i;i<20;i++){ 
cin>>thearray[x-1]; 
} 
} 
int main(){ 
char thearray[21][20];
thefunction(?????????????); 
}

我认真地尝试了大部分 youtube 教程,但没有人具体这样做我真的不知道如何将数组发送到函数

voidname(arrayname[f],20);
void voidname(char arrayname,int [],int []){
}

youtube 上的教程尝试的许多其他方法

c++ arrays char void
2个回答
0
投票

如何在 C++ 中使用字符数组执行函数

char thearray[21][20];

thearray
不是字符数组。它是 char 数组的数组。

将数组传递给函数的典型方法是使用

std::span
模板。由于本例中的数组元素是 20 个字符的数组,因此您可以使用
std::span<char[20]>
。例子:

#include <span>

void thefunction(std::span<char[20]> arrays) { 
    for (auto& array : arrays) { 
        std::cin >> array;
    } 
} 

// usage
char thearray[21][20];
thefunction(thearray); 

0
投票

要传递一维数组,我们会

void function(char arr[])
{
    // do stuff to arr
}

char arr[20];
function(arr);

注意

function
的参数
arr[]
中没有大小。这会导致问题,因为
arr
已经衰减为指针 不再知道它有多大。你几乎总是不得不

void function(char arr[], 
              size_t len) // so function knows when to stop putting stuff into arr
{
    // do stuff to arr
}

二维数组是数组的数组,所以函数需要看起来像是在获取指向内部维度大小的数组的指针

void function(char arr[][some_size_here], 
              size_t len) // so function knows how big arr's outer dimension is
{
    // do stuff to arr
}

在这种情况下

some_size_here
是20.

void function(char arr[][20], 
              size_t len) // so function knows how big arr's outer dimension is
{
    // do stuff to arr
}

这可能是您的教练希望您停下来的地方。但为什么?

我们可以更偷偷摸摸地使用模板概括函数,这样您就不必总是传入 20 个字符的内部数组:

template <size_t N>
void function(char arr[][N], 
              size_t len) // so function knows how big arr's outer dimension is
{
    // do stuff to arr
}

但是如果我们要那样做,我们可以一路深入并模板化所有内容:

template <size_t M, size_t N>
void function(char (&arr)[M][N]) 
{
    // do stuff to arr
}

这不再需要额外的

len
参数,因为它知道长度,
M
N
。虽然有奇怪的皱纹。由于数组会衰减为指针,因此您需要通过引用传递数组以保留其数组特性并收集第一维的大小。或者至少这就是我认为您必须这样做的原因。可能还有其他一些我从未想过的古怪原因。

旁注:这是一个非常好的技巧,可以在不使用

sizeof(x)/sizeof(x[0])
技巧的情况下确定数组的大小。该模板为您捕获尺寸,您只需将其返回即可。请参阅
std::size
以查看此技巧的实际应用。这比
sizeof
更安全,因为
sizeof
将接受来自衰减数组的指针并提供指针的大小除以第一个元素的大小,这几乎总是错误的。如果您不小心输入了指针,模板技巧将不会编译,从而节省了很多调试时间。

我们也可以做一个包含数组的结构体,然后传递这个结构体

struct array
{
    char thearray[21][20];
}

void function(array & arr)
{
    // use arr
}

在这里我们希望通过引用而不是通过值传递(这是传递数组而不衰减的唯一好方法)所以我们不会对副本进行操作。许多新的 C++ 程序员在前几次不小心将他们需要按值编辑的值传递给函数时感到困惑,并发现返回调用者时原始值没有改变。

添加模板以概括大小和一些有用的运算符重载到 array-in-a-

struct
技巧,你几乎只是重新发明了
std::array
.

关于

cin>>thearray[x-1];
的快速说明:直到最近,
>>
读入字符数组才成为现实并防止缓冲区溢出。传统上,因为数组已经退化为指针并且长度丢失,
>>
会兴高采烈地写到数组的末尾并破坏程序。如果您的编译器已过时,这可能是一个陷阱。这是
std::string
被强烈推荐的众多原因之一。

© www.soinside.com 2019 - 2024. All rights reserved.