- 締切済み
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++; } }
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- hitomura
- ベストアンサー率48% (325/664)
「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)
>char temp[16];//文字列Bの大きさ >result.push_back(*temp); tempはローカル変数で、そのアドレスをvectorに追加しています。 と、いうことは、同じ値を追加していることになります。 また、tempの中身が変われば(実際変わりますが)resultのvecotorの中身も変わっているように見えてしまいます。 vectorに追加する文字列の領域をnewで確保してから追加してください。 領域の開放も忘れずに。