char *数组的问题

时间:2014-09-14 17:39:03

标签: c++ arrays pointers char

好的,我有:

char* arr[5];

我有

char input[10];

然后:

int i = 0;
cin.getline(input, 10);
while(input[0] != 'z')
{
    arr[i] = input;
    cin.getline(input, 10);
    i++;
}

结果是arr中的每个元素都是相同的,因为它们都是输入的指针,但是我希望每个元素都指向输入变量在给定时间保存的char数组。

结果这带来了:

arr[0] = line beginning in 'z' (because that is what input currently is holding)
arr[1] = line beginning in 'z'
arr[2] = ... and so on

我想要的结果:

arr[0] = first line read in
arr[1] = second line read in
arr[2] = third line read in and so on...

我很困惑我如何能够将所有元素都指向新值,而不是所有元素都指向相同的值。

3 个答案:

答案 0 :(得分:2)

如果您想要输入5次,可以尝试此代码段

int i = 0;
while(i<5)
{
    arr[i] = input;
    cin.getline(input, 10);
    i++;
}

这应该有效,你可以得到你所希望的结果,如上所述。

编辑: 如评论中所述,这将不起作用。请参阅此处的示例:http://ideone.com/hUQGa7

所需要的是占用arr中每个元素的不同指针值。如何实现这些不同的指针值将在给出的其他答案中讨论。

答案 1 :(得分:0)

您必须每次都复制输入数据。

你可以在while循环中这样做:

while(input[0] != 'z')
{
    arr[i] = new char[strlen(input)];
    strcpy(arr[i], input);

    cin.getline(input, 10);
    i++;
}

由于您已将arr定义为5长度。因此,您必须检查i不超过值5的while循环。i<5

答案 2 :(得分:0)

让我们谈谈角色和指针。

给出一个角色:

+---+  
+ A +  
+---+  

指向角色的指针char *指向角色。就是这样,仅此而已。

字符数组是一个包含字符插槽的容器。指向数组的指针通常指向数组的第一个字符。这就是问题所在。

许多函数需要一个指针,指向数组的第一个字符,但要么不说它是第一个字符,要么指向一个字符,假设指针是数组中的第一个字符。

指针需要指向

的东西

您已经分配了一个指针数组,但没有为每个指针分配内存:

Array
+-----+      +----+---+---+  
|     | -->  |    |   |   |  
|     |      +----+---+---+  
+-----+ 
|     |      +----+---+---+
|     | -->  |    |   |   |  
|     |      +----+---+---+  
+-----+ 

数组的内容是指针。因此,您需要分配内存并将指针放入数组中:

  arr[0] = new char [11]; // +1 for the nul terminator character.
  char text[33];
  arr[1] = text;  

所以你的目标是:

  cin.getline(arr[0], 10);
  cin.getline(arr[1], 33);

字符串太容易处理了。他们管理自己的记忆:

  std::string array_text[5]; // An array of 5 string.
  getline(cin, array_text[0]);  

下一步是使用vector,你们都被抓住了:

  std::vector< std::string > text_vector(5);  // Pre-allocate 5 slots.
  getline(cin.text_vector[2]);