Хорошо, поэтому у меня есть:
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...
Я смущен тем, как я могу заставить все элементы указывать на новые значения, а не на то, чтобы указывать на одно и то же значение.
Пусть говорят персонажи и указатели.
Учитывая характер:
+---+
+ 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]);
Если вы хотите принять вход 5 раз, вы можете попробовать этот сегмент кода
int i = 0;
while(i<5)
{
arr[i] = input;
cin.getline(input, 10);
i++;
}
это должно работать, и вы можете получить свой "желаемый результат", как вы сказали выше.
Изменение: это не будет работать, как описано в комментарии. См. Пример здесь: http://ideone.com/hUQGa7
Требуются разные значения указателя, занимающие каждый из элементов в arr
. Как достичь этих разных значений указателя обсуждается в других ответах.
Вы должны копировать данные ввода каждый раз.
Вы можете сделать это в цикле while:
while(input[0] != 'z')
{
arr[i] = new char[strlen(input)];
strcpy(arr[i], input);
cin.getline(input, 10);
i++;
}
И так как вы определили arr
длиной 5
. Поэтому вам нужно проверить цикл while, чтобы i
не превышал значение 5. i<5
.
char *
и используйтеstd::string
. Вы будете рады, что сделали.