2017-01-21 4 views
0

Я имею дело с динамическими массивами в C++. Справка по следующему коду.увеличить массив с char * [C++]

Я пытаюсь прочитать символы один за другим и сделать C-строку. Если размер массива недостаточен, я его увеличиваю. Но функция IncreArray работает с ошибкой и возвращает строку с другими символами. Что я не так?

void increaseArray(char* str, int &size){ 
    char* newStr = new char[size * 2]; 
    for (int i = 0; i < size; i++){ 
     newStr[i] = str[i]; 
    } 
    size *= 2; 
    delete[] str; 
    str = newStr; 
} 

char* getline() 
{ 
    int size = 8; 
    char* str = new char[size]; 
    char c; 
    int index = 0; 
    while (c = getchar()) { 
     if (index == size) increaseArray(str, size); 
     if (c == '\n') { 
      str[index] = '\0'; 
      break; 
     }; 
     str[index] = c; 
     index++; 
    } 
    return str; 
} 
+1

Это "str = newStr;" устанавливает локальную переменную str в newStr. Эта локальная переменная немедленно отбрасывается. Вам нужен указатель на указатель или ссылка. –

+1

Почему бы вам не использовать 'std :: string' или даже' std :: vector '?? – Walter

+1

_ «Я пытаюсь прочитать символы один за другим и сделать C-строку. Если размер массива недостаточен, я увеличиваю его». Буквально для чего используется 'std :: string'. Почему бы вам не использовать его и избавить себя от неприятностей? Ваш код не будет проходить проверку в моей команде. –

ответ

2

В функции increaseArray вы назначаете newStr к strstr однако локальная копия указателя в increaseArray функции, таким образом, изменение не видно за его пределами.

Простейшее исправление изменить increaseArray подпись:

void increaseArray(char*& str, int &size)

Так ссылка на указатель будет принят, таким образом изменения в str внутри increaseArray будут видны за его пределами.

+0

Спасибо, это действительно помогло. Немного смущен указателями и ссылками. – Zven

2

Вы могли бы это сделать. Его простые ..

#include <string.h> 
#include <stdlib.h> 
using namespace std; 
void increaseArray(char* &str, int size){ 
    str = (char *)realloc(str,size*2); 
} 
+0

К сожалению, это не очень помогает, поскольку вы игнорируете указатель, возвращаемый 'realloc'. – ForceBru

+0

@ForceBru Я это забыл. Я уже внес необходимые изменения в это. – Leandro

+0

На самом деле, поскольку OP использовал 'new []' для выделения своей памяти, он не может использовать 'realloc' в соответствии с [этим ответом] (http://stackoverflow.com/a/33706568/4717805) – Zouch

 Смежные вопросы

  • Нет связанных вопросов^_^