• 締切済み

vectorを使っていたいのですが上手くいきません

文字列(A)から特定の文字列(B)を抽出しながらvectorにどんどん入れていくプログラムを作成しています。(文字列(B)の位置や長さはわかっているとします。) そこで、文字列(A)から、文字列(B)に相当するアドレスをvectorにどんどん入れているのですが、先pushした値が後からpushした値と全て同じ値になってしまいます。 これは、アドレス渡しが原因と分かってはいるのですが、どう書けば上手くいくかわかりません。 そこでご教授頂きたいと思っています。 自分が書いたプログラムは以下になります。 #include <string.h> #include <stdio.h> #include <stdlib.h> #include <vector> using namespace std; void main(){ char* stringA; vector<char*> result; char temp[16];//文字列Bの大きさ for(int i=0;i<file.size();i++){ strncpy(temp,&buffer[i],16); result.push_back(*temp); //次の文字列Bの位置までインデックスを移動//// while(buffer[i]!=0x0A){ i++; } i++; } }

みんなの回答

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.2

「buffer って何?」とか「result.push_back(*temp); でコンパイルエラーにならないの?」とか言いたいことはいくつかありますが、 result.push_back(temp); だとして回答します(コンパイルが通るのはたぶんこれ)。 このコードで result に入るのは char temp[16]; で定義された temp へのポインタです。 その中に入った文字を result に入れたいのならば、std::string を使って vector<string> result; for(int i=0;i<file.size();i++){  string temp(buffer + i, buffer + i + 16);  result.push_back(temp);   … } とするか、 class FixStr {  char str[16 + 1]; public:  FixStr(const char* const instr)  {   if (instr){    strncpy(str, instr, 16);    str[16] = '\0';   } else {    str[0] = '\0';   }  }  FixStr(const FixStr& src)  {   strcpy(str, src.str);  }  FixStr& operator=(const FixStr& src)  {   if (src& != this) strcpy(str, src.str);   return *this;  }  const char* const GetStr() const  {   return str;  } }; というクラスを作って、 vector<FixStr> result; for(int i=0;i<file.size();i++){  result.push_back(FixStr(buffer + i));   … } とするかのどちらかでしょう。

  • mk48a
  • ベストアンサー率56% (1133/2007)
回答No.1

>char temp[16];//文字列Bの大きさ >result.push_back(*temp); tempはローカル変数で、そのアドレスをvectorに追加しています。 と、いうことは、同じ値を追加していることになります。 また、tempの中身が変われば(実際変わりますが)resultのvecotorの中身も変わっているように見えてしまいます。 vectorに追加する文字列の領域をnewで確保してから追加してください。 領域の開放も忘れずに。