dポイントプレゼントキャンペーン実施中!

文字列(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++;
}

}

A 回答 (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));
  …
}
とするかのどちらかでしょう。
    • good
    • 0

>char temp[16];//文字列Bの大きさ


>result.push_back(*temp);

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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!