Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在循环中使用多维字符或字符串数组 我对C++非常陌生,我无法理解如何使用任何多元素数组。我想这样做: input number of product: number; //the products' name can be 7 with NULL char. (max 6) char arr[number][7];_C++_Arrays_String_Char_Multidimensional Array - Fatal编程技术网

如何在循环中使用多维字符或字符串数组 我对C++非常陌生,我无法理解如何使用任何多元素数组。我想这样做: input number of product: number; //the products' name can be 7 with NULL char. (max 6) char arr[number][7];

如何在循环中使用多维字符或字符串数组 我对C++非常陌生,我无法理解如何使用任何多元素数组。我想这样做: input number of product: number; //the products' name can be 7 with NULL char. (max 6) char arr[number][7];,c++,arrays,string,char,multidimensional-array,C++,Arrays,String,Char,Multidimensional Array,这很有效。但当我想在一个循环中这样做时,我: cin>>arr[i][7]; 我不知道编译器到底在做什么 我只想: arr[0][7]=apple; arr[1][7]=orange; 那么,我该怎么做呢?因为arr[I][7]是一个字符,实际上是最后一个元素的后面一个,这意味着您可能会遇到内存访问错误 你想做的也许是 然而,这不是一个很好的主意,因为您无法控制从输入中读取多少字符,这很容易导致内存溢出 简单的方法是像其他人所建议的那样使用std::vector。因为arr[i]

这很有效。但当我想在一个循环中这样做时,我:

cin>>arr[i][7];
我不知道编译器到底在做什么

我只想:

arr[0][7]=apple;
arr[1][7]=orange;
那么,我该怎么做呢?

因为arr[I][7]是一个字符,实际上是最后一个元素的后面一个,这意味着您可能会遇到内存访问错误

你想做的也许是

然而,这不是一个很好的主意,因为您无法控制从输入中读取多少字符,这很容易导致内存溢出

简单的方法是像其他人所建议的那样使用std::vector。

因为arr[i][7]是一个字符,实际上是最后一个元素的一个,这意味着您可能会遇到内存访问错误

你想做的也许是

然而,这不是一个很好的主意,因为您无法控制从输入中读取多少字符,这很容易导致内存溢出


简单的方法是像其他人建议的那样使用std::vector。

您有一个二维字符数组

然后尝试为它们分配一个字符串char*或const char*,这将不起作用。您可以在此处指定一个字符,例如:

arr[0][1] = 'a';
如果可以的话,我建议使用std::vector和std::string,这会让事情变得更清楚。在你的情况下,你可以这样做

cin>>arr[i];
但我不建议您使用它,因为您最多只能存储6个字符的char*字符串和空终止符。您还可以有一个字符数组*

char* arr[number];

然后动态分配内存来存储字符串。

您有一个二维字符数组

strcpy(&arr[0], "apple");
strcpy(&arr[1], "orange");
然后尝试为它们分配一个字符串char*或const char*,这将不起作用。您可以在此处指定一个字符,例如:

arr[0][1] = 'a';
如果可以的话,我建议使用std::vector和std::string,这会让事情变得更清楚。在你的情况下,你可以这样做

cin>>arr[i];
但我不建议您使用它,因为您最多只能存储6个字符的char*字符串和空终止符。您还可以有一个字符数组*

char* arr[number];
然后动态分配内存来存储字符串

strcpy(&arr[0], "apple");
strcpy(&arr[1], "orange");
<>但是对于C++来说,最好使用STD::string数组的向量:

#include <string>
#include <vector>

<>但是对于C++,最好使用STD::vector数组的字符串

,除非你有一个真正的原因,你不应该隐藏我们,让BJ ORN说并使用一个字符串向量。您甚至可以取消对总尺寸的初始请求:

#include <string>
#include <vector>
#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";

除非你有一个真正的理由,不能对我们隐瞒,否则就按照比约恩说的做,并使用字符串向量。您甚至可以取消对总尺寸的初始请求:

#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";

一旦您理解了std::vector和std::string,使用它们通常会省去您的麻烦。既然你是C++的全新的,那么无论如何都可以理解二维数组到底是怎么回事。 当你说

char array[N][M];
当N和M是常量而不是变量时,您告诉编译器分配N*M个char类型的项。将有一个内存块专用于大小为N*M*sizeofchar的数组。您可以声明任何内容的数组,而不仅仅是char。由于sizeofchar为1,内存长度将为N*M字节。如果查看原始内存,内存中的第一个字节将位于数组[0][0]所在的位置。第二个字节是数组[0][1]所在的位置,以此类推,表示M个字节。然后您将看到数组[1][0]。这称为行主顺序

正如@jbat100所提到的,当你说array[i][j]时,你指的是单个字符。当您说array[i]时,您指的是数组中第i行的地址。内存中没有实际存储的指针,但当您说array[i]时,编译器知道您的意思是希望数组中的行i的地址:

char* row_i = array[i];
<>现在,如果i>0,那么ROWI i指向位于该数组的内存块的某个地方。这将做同样的事情:

char* row_i = &array[i][0];
如果您有一个橙色字符串,并且知道它的长度小于M,则可以将其存储在数组中的给定行中,如下所示:

strcpy(array[i], "orange"); // or
array[i][0] = 'o'; array[i][1] = 'a'; ... array[i][6] = 0;
或者你可以说行i而不是数组[i]。这会将7个字节复制到第i行位置的数组中。StrcPy也复制一个额外的字节,它是0,这是终止C和C++中字符串的约定。所以这7个字节是6个字节,‘o’、‘r’、‘a’、‘n’、‘g’和‘e’,再加上一个0字节。现在strcmprow_i,橙色==0

请注意,如果字符串长度超过M,strcpy和简单字符赋值可能不会产生编译错误,但最终会将字符串的一部分复制到下一行


阅读一本好的C/C++书籍中有关指针和数组的内容。

一旦理解了它们,使用std::vector和std::string通常会省去您的麻烦。由于C++是全新的,所以了解二维数组的运行情况可能是有用的。 哎哟

当你说

char array[N][M];
当N和M是常量而不是变量时,您告诉编译器分配N*M个char类型的项。将有一个内存块专用于大小为N*M*sizeofchar的数组。您可以声明任何内容的数组,而不仅仅是char。由于sizeofchar为1,内存长度将为N*M字节。如果查看原始内存,内存中的第一个字节将位于数组[0][0]所在的位置。第二个字节是数组[0][1]所在的位置,以此类推,表示M个字节。然后您将看到数组[1][0]。这称为行主顺序

正如@jbat100所提到的,当你说array[i][j]时,你指的是单个字符。当您说array[i]时,您指的是数组中第i行的地址。内存中没有实际存储的指针,但当您说array[i]时,编译器知道您的意思是希望数组中的行i的地址:

char* row_i = array[i];
<>现在,如果i>0,那么ROWI i指向位于该数组的内存块的某个地方。这将做同样的事情:

char* row_i = &array[i][0];
如果您有一个橙色字符串,并且知道它的长度小于M,则可以将其存储在数组中的给定行中,如下所示:

strcpy(array[i], "orange"); // or
array[i][0] = 'o'; array[i][1] = 'a'; ... array[i][6] = 0;
或者你可以说行i而不是数组[i]。这会将7个字节复制到第i行位置的数组中。StrcPy也复制一个额外的字节,它是0,这是终止C和C++中字符串的约定。所以这7个字节是6个字节,‘o’、‘r’、‘a’、‘n’、‘g’和‘e’,再加上一个0字节。现在strcmprow_i,橙色==0

请注意,如果字符串长度超过M,strcpy和简单字符赋值可能不会产生编译错误,但最终会将字符串的一部分复制到下一行



阅读一本优秀的C/C++书籍中有关指针和数组的内容。

由于您是新手,您可以从一开始就学习良好的实践-为此使用std::vector。您是否有真正的、经过深思熟虑的理由不使用字符串向量?如果不是,那么使用一个字符串向量。KerrekSB:我有一种直觉,那个屏幕名字的人不会有一个现成的真正的,尽管这是因为她对C++是新的。诸如此类,因为您是新手,所以您可以从一开始就学习良好的实践—为此使用std::vector。您是否有真正的、经过深思熟虑的理由不使用字符串向量?如果不是,那么使用一个字符串向量。KerrekSB:我有一种直觉,那个屏幕名字的人不会有一个现成的真正的,尽管这是因为她对C++是新的。类似的东西可能会工作,但用户将从键盘输入产品。那么我应该使用什么类型的变量呢?例如:char-pr;cin>>公共关系;strcpy&arr[0],pr;行得通吗?这行不通。一次只能获取一个字符,strcpy是错误的。如果有std::vector over char[]],我会选择它。否:开始时使用std::string,很简单。但如果仍要使用字符数组,则应定义数组,如字符输入[7],并使用它,但如果有人输入长度超过6个字符的字符串,则可能会损坏内存,并导致分段错误&arr[0]实际上是一个编译错误,至少对于g++。说arr[0]或&arr[0][0]。这可能有效,但用户将从键盘输入产品。那么我应该使用什么类型的变量呢?例如:char-pr;cin>>公共关系;strcpy&arr[0],pr;行得通吗?这行不通。一次只能获取一个字符,strcpy是错误的。如果有std::vector over char[]],我会选择它。否:开始时使用std::string,很简单。但如果仍要使用字符数组,则应定义数组,如字符输入[7],并使用它,但如果有人输入长度超过6个字符的字符串,则可能会损坏内存,并导致分段错误&arr[0]实际上是一个编译错误,至少对于g++。说arr[0]或&arr[0][0]。嗯。我忽略了第一个维度是硬编码而不是char*[]的事实,它不起作用。当我输入apple并观察手表屏幕上的变量时,它是这样的:arr[i]='a':\cin>>arr[i]是一个非常糟糕的主意-输入太多会导致写入超出数组末尾。您最好使用std::vector,并安全地写入每个字符串。@whocare它对我的简单程序std::cin>>arr[0]有效;std::coutmmm。我忽略了第一个维度是硬编码而不是char*[]的事实,它不起作用。当我输入apple并观察手表屏幕上的变量时,它是这样的:arr[i]='a':\cin>>arr[i]是一个非常糟糕的主意-输入太多会导致写入超出数组末尾。您最好使用std::vector,并安全地写入每个字符串。@whocare它对我的简单程序std::cin>>arr[0]有效;他们。我不能用strcmp处理那种类型的数据?我正试图将其与链接列表中的数据进行比较:产品->名称。it错误:无法转换“std::basic\u st”
对参数“1”到“int StrcMPconst char”、const char * '`WOCARARS的环的“to”const char *:我用更多的C++风格的方法更新了STD::String和与C API交互的方式。然而,函数的STR*族是冗余的,而不是C++风格的。所以,不要用它,嘿。我不能用strcmp处理那种类型的数据?我正试图将其与链接列表中的数据进行比较:产品->名称。IT错误:不能将“STD::Basic字符串”转换为“const char”,用于参数“1”到“int StrcMPconst char,const char *”@ WaCARES:我用更多C++风格的方法更新了STD::String和与C API交互的方式。然而,函数的STR*族是冗余的,而不是C++风格的。所以,不要用它。