我对C++很陌生,我只是不知道如何使用任何多二元数组。我想做这样的事情:
input number of product: number; //the products' name can be 7 with NULL char. (max 6)
char arr[number][7];
这行得通。但是当我想在 for 循环(i( 中执行此操作时:
cin>>arr[i][7];
我不知道编译器到底在做什么?
我只想要:
arr[0][7]=apple;
arr[1][7]=orange;
那么请问我该怎么做?
#include <string>
#include <vector>
既然每个人都推荐它,我想我会为你勾勒出选项。
请注意,如果您提供了一个简短的工作示例代码片段,您将在 10 毫秒内得到 3 个不同的人给出这种答案(翻译代码 1:1 比"思考"您可能识别的示例更有效(
给你:
std::vector<std::string> strings
strings.push_back("apple");
strings.push_back("banana");
// or
std::string s;
std::cin >> s; // a word
strings.push_back(s);
// or
std::getline(std::cin, s); // a whole line
strings.push_back(s);
// or:
// add #include <iterator>
// add #include <algorithm>
std::copy(std::istream_iterator<std::string>(std::cin),
std::istream_iterator<std::string>(),
std::back_inserter(strings));
也可以直接寻址:
std::vector<std::string> strings(10); // 10 empty strings
strings[7] = "seventh";
编辑以回复评论:
const char* eighth = "eighth";
if (strings[7] != eighth)
{
// not equal
}
// If you really **must** (read, no you don't) you can get a const char* for the string:
const char* sz = strings[7].c_str(); // warning:
// invalidated when `strings[7]` is modified/destructed
除非你有真正的理由(你不能对我们隐瞒(,否则按照 Björn 所说的去做并使用字符串向量。您甚至可以取消对总大小的初始请求:
#include <string>
#include <vector>
#include <iostream>
std::vector<std::string> fruits;
std::string line;
while (std::getline(std::cin, line))
{
fruits.push_back(line);
}
让我们测试一下:
std::cout << "You entered the following items:n";
for (auto const & f : fruits) std::cout << "* " << f << "n";
因为arr[i][7]
是一个char
,实际上是最后一个元素之后的一个,这意味着你可能会得到内存访问错误。
你想做的也许cin>>arr[i];
.
无论如何,这不是一个好主意,因为您无法控制从输入中读取多少个字符,这很容易导致内存溢出。
简单的方法是按照其他人的建议使用std::vector<std::string>
。
strcpy(&arr[0], "apple");
strcpy(&arr[1], "orange");
但是对于C++最好将std::vector<std::string>
用于字符串数组
你有一个二维数组char
char arr[number][7];
然后尝试为他们分配一个字符串(char* 或 const char*(,这将不起作用。您可以在此处分配一个字符,例如:
arr[0][1] = 'a';
如果可以的话,我建议使用std::vector
,std::string
它会让事情变得更加清晰。在您的情况下,您可以做
cin>>arr[i];
但我不推荐它,因为您最多只能存储 6 个字符的 char* 字符串(加上空终止符(。您还可以拥有字符数组*
char* arr[number];
然后动态分配内存来存储字符串。
vector 和 std::string 通常会在你理解它们后省去你的麻烦。 由于您是C++的新手,因此无论如何了解二维数组的情况可能会很有用。
当你说
char array[N][M];
由于 N 和 M 是常量,而不是变量,因此您告诉编译器分配 char 类型的 N*M 项。 将有一个内存块专用于大小为 N*M*sizeof(char( 的数组。 (您可以声明任何内容的数组,而不仅仅是字符。 由于 sizeof(char( 为 1,因此内存长度为 N*M 字节。 如果您查看原始内存,内存中的第一个字节将是 array[0][0] 所在的位置。 第二个字节是 Array[0][1] 所在的位置,依此类推,对于 M 个字节。 然后你会看到数组[1][0]。 这称为行主序。
正如@jbat100提到的,当你说数组[i][j]时,你指的是一个字符。 当你说数组[i]时,你指的是数组中行i的地址。 内存中实际上没有指针存储,但是当你说数组[i]时,编译器知道你的意思是你想要数组中行i的地址:
char* row_i = array[i];
现在,如果 i>0,则row_i指向专用于阵列的内存块中间的某个位置。 这将做同样的事情:
char* row_i = &array[i][0];
如果你有一个字符串"orange",并且你知道它的长度小于M,你可以把它存储在数组中的给定行中,如下所示:
strcpy(array[i], "orange"); // or
array[i][0] = 'o'; array[i][1] = 'a'; ... array[i][6] = 0;
或者你可以说row_i而不是数组[i]。 这会将 7 个字节复制到数组中row_i的位置。 strcpy(( 还复制了一个额外的字节,该字节是 0,这是在 C 和 C++ 中终止字符串的约定。 因此,7 个字节是六个字节,"o"、"r"、"a"、"n"、"g"和"e",再加上一个 0 字节。 现在 strcmp(row_i, "橙色"( == 0。
请注意,如果您的字符串比 M 长,strcpy 和简单的 char 赋值不会(可能(产生编译错误,但您最终会将部分字符串复制到下一行。
阅读一本好的 C/C++ 书中的指针和数组。