![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67b6d)
文字列(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件)
- 最新から表示
- 回答順に表示
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));
…
}
とするかのどちらかでしょう。
No.1
- 回答日時:
>char temp[16];//文字列Bの大きさ
>result.push_back(*temp);
tempはローカル変数で、そのアドレスをvectorに追加しています。
と、いうことは、同じ値を追加していることになります。
また、tempの中身が変われば(実際変わりますが)resultのvecotorの中身も変わっているように見えてしまいます。
vectorに追加する文字列の領域をnewで確保してから追加してください。
領域の開放も忘れずに。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・【大喜利】【投稿~8/27】 こんなガソリンスタンド二度と来るか!なぜそう思った?
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・【お題】動物のキャッチフレーズ
- ・【お題】甲子園での思い出の残し方
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・自分用のお土産
- ・人生で一番お金がなかったとき
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・ちょっと先の未来クイズ第1問
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CStringからchar*への型変換に...
-
C言語にて構造体のメンバがNULL...
-
char*を初期化したいのですが
-
new charとnew char[N]の違いは?
-
strcat関数を自作したいです
-
2次元配列の文字"列"の初期化方法
-
ASCIIコードへの変換方法
-
小数点入りの文字列をfloat型に...
-
C言語を用いた環境変数の作成/...
-
カンマで区切った文字の抽出に...
-
SetWindowTextについて。
-
C++Builder 2009 テキスト...
-
エクセルのMID関数は、C言語では?
-
char AA[]{"全角文字"};から"全...
-
unsignedの使い分け
-
文字列の連結
-
char 文字列型 の表現範囲が-12...
-
C++です。cin.peek()で先頭を除...
-
SubStringの使い方について
-
C言語(C89)での文字列代入
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
char*を初期化したいのですが
-
C言語のintとcharの違いってな...
-
CStringからchar*への型変換に...
-
C言語にて構造体のメンバがNULL...
-
fstream型オブジェクトを関数の...
-
小数点入りの文字列をfloat型に...
-
char型にint型の数値を代入する。
-
const char* s1とただのchar s1...
-
new charとnew char[N]の違いは?
-
動的メモリの初期化方法について。
-
エクセルのMID関数は、C言語では?
-
char 文字列型 の表現範囲が-12...
-
C言語 strstrの実装
-
SetWindowTextについて。
-
文字列の途中から途中までを抽出
-
2次元配列の文字"列"の初期化方法
-
DWORDとcharの変換
-
C++17で、unsigned char * 配列...
-
C言語の文字リテラル中の16進文...
-
strcat関数を自作したいです
おすすめ情報