好的,我有:
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...
我很困惑我如何能够将所有元素都指向新值,而不是所有元素都指向相同的值。
答案 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]);