0

現在、charpointers のベクトルを使用して、個々の文字列の束を保持しようとしています

vector<char*> strings(10);

個々の文字列はchar indString[100]

そして、私はこれを行って、それぞれを割り当てます

for (int i=0; i < iLimit; ++i){
    gets(indString);
    strings[i] = indString;
}

しかし、すべてを出力すると

for (auto & stri: strings) cout << stri << endl;

最後に読み取った文字列の繰り返しがたくさんあります。

4

4 に答える 4

1

すべての反復に同じポインターを追加しているためvector、出力に重複が表示されます。、およびを使用して、これを効率的かつきれいに行うことができます。std::getlinestd::stringstd::move

以下は、文字列を読み取りcin、ベクトルの内容を出力する実際の例です。

#include <vector>
#include <string>

void readtext(
    std::istream& input,
    std::vector<std::string>& text,
    const size_t limit)
{
    std::string line;
    for (size_t count = 0; count < limit && std::getline(input, line); ++count)
        text.push_back(std::move(line));
}

int main()
{
    std::vector<std::string> text;
    readtext(std::cin, text, 3);
    for (auto& line : text)
        std::cout << line << std::endl;
}
于 2013-08-03T16:30:19.013 に答える
1

読み取りに使用されるバッファーへのポインターを格納しているだけです...すべてのポインターが同じバッファーを指すため、最後の文字列が繰り返されます。

std::vector<std::string>代わりにを使用してください。

于 2013-08-03T16:03:21.827 に答える
0

それらはすべて同じポインタを指しています。これを行うことをお勧めします:

char** PointerArray = new char*[NumOfStrings];

//input strings

for( int i = 0; i < NumOfStrings; i++ )
     cout << PointerArray[i];

for( int i = 0; i < NumOfStrings; i++ )
     delete[] PointerArray[i];

編集:ベクトルが必要な場合は、文字配列の配列を作成し、各文字をそれに渡します。

または、これを試すことができます:

char** PointerArray = new char*[NumOfStrings];

vector<char*> pointerArray(NumOfStrings);
for( int i = 0; i < NumOfStrings; i++ )
     pointerArray[i] = PointerArray[i];
//stuff
for( int i = 0; i < NumOfStrings; i++ )
     delete[] pointerArray[i];
于 2013-08-03T16:08:15.517 に答える