我是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;
那我该怎么办呢?
答案 0 :(得分:3)
#include <string>
#include <vector>
既然每个人都在推荐它,我想我会为你勾勒出选项。
请注意,3个不同的人会在10毫秒内得到这样的答案,如果您提供了一个简短的工作示例代码段(翻译代码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
答案 1 :(得分:1)
因为arr[i][7]
是char
,实际上是一个超过最后一个元素,这意味着您可能会遇到内存访问错误。
您想要做的事可能是cin>>arr[i];
。
然而,这不是一个好主意,因为你无法控制从输入中读取多少个字符,这很容易导致内存溢出。
简单的方法是使用其他人建议的std::vector<std::string>
。
答案 2 :(得分:1)
除非你有真正的理由(你不能向我们隐瞒),否则请按照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";
答案 3 :(得分:0)
你有一个char
char arr[number][7];
然后尝试为它们分配一个不起作用的字符串(char *或const char *)。你在这里可以做的是分配一个角色,例如:
arr[0][1] = 'a';
如果可以,我建议您使用std::vector
和std::string
,这会让事情变得更加清晰。在你的情况下你可以做
cin>>arr[i];
但我不推荐它,因为你最多只能存储6个字符的char *字符串(加上空终止符)。你也可以有一个char *
数组char* arr[number];
然后动态分配内存来存储字符串。
答案 4 :(得分:0)
strcpy(&arr[0], "apple");
strcpy(&arr[1], "orange");
但对于C ++,最好将std::vector<std::string>
用于字符串数组
答案 5 :(得分:0)
使用std :: vector和std :: string一旦理解了它们,通常会让您头疼。既然你是C ++的新手,那么无论如何理解二维数组的内容可能会很有用。
当你说
时char array[N][M];
当N和M是常量而不是变量时,您告诉编译器分配类型为char的N * M项。将存在专用于大小为N * M * sizeof(char)的阵列的存储器块。 (你可以声明一个任何东西的数组,而不仅仅是char。因为sizeof(char)是1,所以内存将是N * M字节长。)如果查看原始内存,内存中的第一个字节将是array [ 0] [0]是。对于M个字节,第二个字节是array [0] [1]所在的位置,依此类推。然后你会看到数组[1] [0]。这称为行主要订单。
正如@ jbat100所提到的,当你说数组[i] [j]时,你指的是一个字符。当你说array [i]时,你指的是数组中第i行的地址。实际上没有指针存储在内存中,但是当你说array [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而不是array [i]。这将7个字节复制到row_i位置的数组中。 strcpy()还复制一个0的额外字节,这是在C和C ++中终止字符串的惯例。所以7个字节是6个字节,'o','r','a','n','g'和'e',再加上0个字节。现在strcmp(row_i,“orange”)== 0。
请注意,如果您的字符串长于M,strcpy和简单的char赋值将不会(可能)产生编译错误,但您最终会将部分字符串复制到下一行。
在一本好的C / C ++书中阅读指针和数组。