我是 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);
我从上面得到的输出是:
这对我来说毫无意义,为什么行数是 13 而不是 4。我也尝试过:
char arr[][SIZE] = {{'A','3','@'},{'#','t','9'}};
add(arr,2,3,5);
这就是我期望得到的。
我也尝试过替换这一行:
while (arr[rowSize][0] != '\0') rowSize++;
与
while (arr[rowSize] != NULL) rowSize++;
但这不会给我任何输出,因为它永远不会停止运行,因为我认为它卡在 while 循环中。任何关于为什么这不起作用以及如何补救的指导/解释将不胜感激。
技巧是在定义内置数组的位置使用
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
的情况下获取您所询问的内容。然而,在几乎所有用例中,最好使用这些标准库容器之一而不是内置数组。