如何将 char 数组放入函数中,而数组的大小在 main 中声明

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

我试图将二维字符数组放入函数中,但问题是: 两个维度的大小都是在主函数中使用“const int”参数声明的,我无法更改该部分。如果我现在尝试编译程序,编译器会说数组的大小未声明。

我试图通过使用指针和引用运算符来解决这个问题,但我在该领域的知识还不够丰富。我也尝试给程序一个提示,它将被声明,但它不起作用:

void test(const int a, const int b, char* array)
{  .......... }
int main()
{
    const int a=2;
    const int b=3;
    char array[a][b];
    ......  
    test(a,b,&array);
}


test.cpp: In function 'int main()':
test.cpp:28:17: error: cannot convert 'char (*)[2][3]' to 'char*' for argument '3' to 'void test(int, int, char*)'
  test(a,b,&array);

重点是,以类似的方式,我在函数之外得到了一个一维字符串数组,我尝试了其他方法,但出了问题:


void test(const int a, const int b, char* array)
{.........}
int main()
{
    const int a=2;
    const int b=3;
    char * array = new char [a][b];
    ..........
    test(a,b,*array);
}


test.cpp:20:31: error: cannot convert 'char (*)[3]' to 'char*' in initialization
char * array = new char [a][b];
test.cpp:5:6: note:   initializing argument 3 of 'void test(int, int, char*)'
 void test(const int a, const int b, char* array)
c++ arrays function pointers
3个回答
0
投票

像这样

void test(const int a, const int b, char (*array)[3])
{
    ...
}

这也可以,(如果你愿意的话)

void test(const int a, const int b, char array[2][3])
{
    ...
}

还有这个(注意不是

&

test(a,b,array);

另一方面,如果您希望将任意大小的二维数组传递到常规函数中,那么这在 C++(或 C)中根本不可能。请改用 2D

std::vector


0
投票

对于当前的 C++,请使用 std::array 作为固定样式数组,这也允许您在运行时获取它们的大小。理由:减少 C++ 中(原始)指针的使用。 (如C++核心指南中所述)

#include <array>
#include <iostream>

// Define compile time constants
static constexpr std::size_t rows_v = 2;
static constexpr std::size_t cols_v = 3;

// In C++ try to avoid "C" style arrays
// std::array may be a bit more typing but you can pass it easily to functions
// AND it will keep track of its sizes (which "C")
// It also allows you to return arrays from functions WITHOUT having to use pointers.

// I make a type alias here
using my_array_t = std::array<std::array<char, cols_v>, rows_v>;


// pass array by reference to avoid copies
// pass by const so that test only can read values (not modify them).
void test(const my_array_t& values)
{
    // you can just get the size in the function
    // by getting it from the array
    std::cout << "The number of rows = " << values.size() << "\n";
    std::cout << "The number of columns = " << values[0].size() << "\n";

    // with arrays (and other containers) you can and
    // should use range based for loops when you can.
    for (const auto& row : values)
    {
        for (const auto& value : row)
        {
            std::cout << value << " ";
        }
        std::cout << "\n";
    }
}

// To show you can return arrays from functions without pointers
// also do not worry C++ will not make unecessary copy of the 
// returned array 
my_array_t initialize_array()
{
    my_array_t values{ { {'a','b','c'}, {'d','e','f'} } };
    return values;
}


int main()
{
    auto values = initialize_array();
    test(values);

    return 0;
}

0
投票

这里有一个解决方案,将

array[0][0]
的地址传递给
test()
函数并将 2D char 数组视为 1D。

Coliru 直播

#include <iostream>
#include <string_view>

void test(int a, int b, char* array) {
  for (int i = 0; i < a; i++) {
    std::cout << std::string_view(array + i * b, b) << std::endl;
  }
}

int main() {
  const int a = 2;
  const int b = 3;
  char array[a][b];
  array[0][0] = 'a';
  array[0][1] = 'a';
  array[0][2] = 'a';
  array[1][0] = 'b';
  array[1][1] = 'b';
  array[1][2] = 'b';
  test(a, b, &array[0][0]);
}

请注意,

const
const int a
限定符没有意义,可以省略。请参阅此TotW页面了解详细信息。

如果您想拥有 char 数组的只读视图并对其使用一些

std::string_view
方法,我还想提请您注意
std::string
(C++17 起)。 是关于
std::string_view
的很好的教程。

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