2017-01-21 5 views
0

C++で動的配列を扱っています。次のコードを参考にしてください。char * [C++]

私は文字を1つずつ読み込み、C文字列を作成しようとしています。配列のサイズが十分でない場合、私はそれを増やします。しかし、関数increaseArrayはエラーとともに動作し、他の文字列を返します。私は間違っている?機能increaseArray

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

_ "文字を1つずつ読み込んでC文字列を作成しようとしていますが、配列サイズが足りない場合は、文字列を増やしています" _文字通り 'std :: string'が対象です。なぜあなたはそれを使用し、自分自身の問題を保存しないでください?あなたのコードは私のチームのレビューに合格しません。 –

答えて

2

ただしstrstrnewStrを割り当てる従って変化が外見えないincreaseArray関数ポインタのローカルコピーです。その外部表示されるようになり、そこで渡されるポインタを基準として

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

increaseArray内部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 [] 'を使ってメモリを割り当てていたので、[this answer](http://stackoverflow.com/a/33706568/4717805)に従って' realloc'を使うことはできません。 – Zouch