当数组传递给函数时,如何在 C++ 中查找二维数组的行数

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

我是 C++ 新手,我有一个函数,将 set int val 添加到输入的 char 数组的 ascii 值中,为此,我需要检查输入的 arr 的大小是否等于行乘以列。问题是,由于 arr 是作为指针传入的,我知道我不能使用 sizeof() 命令,所以我试图想出另一个解决方案来计算 arr 的行数和列数,这样我就可以将它与行乘列进行比较。

void add(char arr[][SIZE], int rows, int cols, int val){

    int arraySize = rows*cols;
    int rowSize = 0;
    int count = 0;

    while (arr[rowSize][0] != '\0') rowSize++; 

    for (int i = 0; i < rowSize; i++){
        int j = 0;
        while (arr[i][j] != '\0'){
            count++;
            j++;
        } 
        cout << j << arr[i] << endl;
    }

    cout << count << endl << rowSize << endl << arraySize << endl;
}

我在 main 中的输入是:

    char arr[][SIZE] = {"bot  ","rot  ", "found", "low  "};
    add(arr,4,5,5);

我从上面得到的输出是:

terminal output #1

这对我来说毫无意义,为什么行数是 13 而不是 4。我也尝试过:

    char arr[][SIZE] = {{'A','3','@'},{'#','t','9'}};
    add(arr,2,3,5);

其输出是: terminal output #2

这就是我期望得到的。

我也尝试过替换这一行:

while (arr[rowSize][0] != '\0') rowSize++;

while (arr[rowSize] != NULL) rowSize++;

但这不会给我任何输出,因为它永远不会停止运行,因为我认为它卡在 while 循环中。任何关于为什么这不起作用以及如何补救的指导/解释将不胜感激。

c++ multidimensional-array row
1个回答
0
投票
如何获取内置数组的大小。

技巧是在定义内置数组的位置使用

sizeof
sizeof
的括号内,数组名称
不会衰减为指向第一个元素的指针,所以你得到整个数组的正确大小(以字节为单位)(加上它使用的任何填充)。将其除以其中一个元素的大小时,商即可得出数组元素的数量。

char arr = { 'a', 'b', 'c' }; auto SIZE = sizeof(arr) / sizeof(char);
对于“二维 char 数组”——实际上是一个“(char 数组)数组”——你可以使用这个:

enum : std::size_t { COLS = 3 }; char arr[][COLS] = {{'a', 'b', 'c' }, {'d', 'e', 'f' }}; auto ROWS = sizeof(arr) / sizeof(arr[0]);
之后,您必须将数组及其大小传递给任何使用该数组的函数。

您的示例中的两个数组非常不同。第一个是“char 数组”。这与“字符串文字数组”不同。除非您将空字符

'\0'

 放在第一个数组中的某个位置,否则它不会在那里。编译器不会把它放在那里。

第二个数组是“指向 const char 的指针数组”。其初始化程序中使用的字符串文字存储在静态内存中。每个字符串文字都有一个由编译器提供的存储在末尾的空字符

'\0'

。该数组在堆栈上分配,并且指向存储在静态内存中的字符串文字的指针存储在数组内部。

下面的程序演示了如何获取每种数组的大小,以及如何将其传递给函数。这是一个完整的运行程序,因此您应该能够复制和粘贴并测试它,而无需太多的摆弄。

#include <cstddef> #include <iostream> #include <sstream> enum : std::size_t { COLS = 3 }; void demo1_test(char arr[][COLS], std::size_t const ROWS) { std::size_t const SIZE{ ROWS * COLS }; std::cout << "ROWS : " << ROWS << std::endl << "COLS : " << COLS << std::endl << "SIZE : " << SIZE << std::endl << std::endl; } void demo1() { std::cout << "Demo 1: array (arrays of char) \n"; char arr[][COLS] = { {'A','3','@'},{'#','t','9'} }; std::size_t constexpr const ROWS{ sizeof(arr) / sizeof(arr[0])}; std::size_t constexpr const SIZE{ ROWS * COLS }; demo1_test(arr, ROWS); } void demo2_test(char const* arr[], std::size_t SIZE) { std::cout << "SIZE == " << SIZE << std::endl; for (std::size_t i = 0; i < SIZE; ++i) std::cout << arr[i] << " "; std::cout << "\n\n"; } void demo2() { std::cout <<"Demo 2: array of pointer to const char \n"; char const* arr[] = { "bot ","rot ", "found", "low " }; std::size_t constexpr const SIZE{ sizeof(arr) / sizeof(char const*) }; demo2_test(arr, SIZE); } int main() { demo1(); demo2(); }
这是输出:

Demo 1: array (arrays of char) ROWS : 2 COLS : 3 SIZE : 6 Demo 2: array of pointer to const char SIZE == 4 bot rot found low
结论
此答案演示了如何在不使用

std::array

std::vector
 的情况下获取您所询问的内容。然而,在几乎所有用例中,最好使用这些标准库容器之一而不是内置数组。

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