0

现在我正在尝试使用一个字符指针向量来保存一堆单独的字符串

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

您只是将指针存储到用于读取的缓冲区...所有指针都将指向同一个缓冲区,这就是您看到最后一个字符串重复的原因。

只需使用 anstd::vector<std::string>代替。

于 2013-08-03T16:03:21.827 回答
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 回答
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 回答
0

您将所有内容都指向strings[i]同一个位置......您需要为每个字符串分配不同的内存位置,并将它们读入该位置。使用 char 数组,它看起来像这样:

char* strings[10];

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

或完整代码(已测试):

#include <stdio.h>
#include <stdlib.h>
#define sizeOfLargestString 100
#define N 3

int main(void) {
  int ii;
  char* strings[N];
  for (ii=0; ii < N; ii++) {
    strings[ii] = (char*)malloc(sizeOfLargestString + 1);
    gets(strings[ii]);
  }
  for(ii=0 ;ii< N; ii++) {
    printf("%s\n", strings[ii]);
  }
  return 0;
}
于 2013-08-03T16:13:07.133 回答