簡體   English   中英

快速C ++ I / O將字符串(char數組)讀入向量,加上解決錯誤

[英]Fast C++ I/O to read a string (char array) into a vector, plus resolving error

現在我正在嘗試使用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;

我只是讀了一堆最后一個字符串的重復。

您只是將指針存儲到用於讀取的緩沖區...所有指針都將指向同一個緩沖區,這就是您看到最后一個字符串重復的原因。

只需使用std::vector<std::string>

您在每次迭代時向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;
}

他們都指向同一個指針。 我建議這樣做:

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];

您將所有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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM