Проблема с массивом char *

0

Хорошо, поэтому у меня есть:

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...

Я смущен тем, как я могу заставить все элементы указывать на новые значения, а не на то, чтобы указывать на одно и то же значение.

  • 2
    Остановитесь сейчас с char * и используйте std::string . Вы будете рады, что сделали.
  • 0
    Я не могу Это условие в проекте, над которым я работаю.
Показать ещё 6 комментариев
Теги:
arrays
pointers
char

3 ответа

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]);
  • 0
    Спасибо за информацию, это было полезно
2

Если вы хотите принять вход 5 раз, вы можете попробовать этот сегмент кода

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

это должно работать, и вы можете получить свой "желаемый результат", как вы сказали выше.

Изменение: это не будет работать, как описано в комментарии. См. Пример здесь: http://ideone.com/hUQGa7

Требуются разные значения указателя, занимающие каждый из элементов в arr. Как достичь этих разных значений указателя обсуждается в других ответах.

  • 0
    Это не будет работать. Вы храните указатель, который никогда не изменяется, поэтому в конце вы получите последние введенные данные для всех записей в обр. Смотрите здесь: ideone.com/hUQGa7
0

Вы должны копировать данные ввода каждый раз.

Вы можете сделать это в цикле 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.

  • 0
    В вашем коде есть серьезная ошибка.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню