文字列(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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# このプログラミング誰か教えてください。 2 2022/04/22 18:48
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# c言語 int temp = 0; if(isdigit(arr[i])){ temp=arr[i] 2 2022/03/27 01:44
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
char*を初期化したいのですが
-
ポインタを使って回文かどうか...
-
C言語のintとcharの違いってな...
-
小数点入りの文字列をfloat型に...
-
CStringからchar*への型変換に...
-
ポインタ配列
-
C言語にて構造体のメンバがNULL...
-
C言語:小文字を大文字に変換す...
-
strcat関数を自作したいです
-
char 文字列型 の表現範囲が-12...
-
C# ポインタ アクセス違反
-
new charとnew char[N]の違いは?
-
strcat関数
-
C++Builder 2009 テキスト...
-
36進数
-
[C] 構造体メンバーのカンマ区...
-
コマンドライン引数 *argv[]は...
-
DWORDとcharの変換
-
2次元配列の文字"列"の初期化方法
-
メモリを0クリアする方法について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のintとcharの違いってな...
-
char*を初期化したいのですが
-
C言語にて構造体のメンバがNULL...
-
CStringからchar*への型変換に...
-
strcat関数を自作したいです
-
new charとnew char[N]の違いは?
-
csvファイルをfscanfで読み込む...
-
char型にint型の数値を代入する。
-
動的メモリの初期化方法について。
-
C言語で文字列をかえす正しい書...
-
文字列str内の全ての数字を...
-
char 文字列型 の表現範囲が-12...
-
DWORDとcharの変換
-
fstream型オブジェクトを関数の...
-
小数点入りの文字列をfloat型に...
-
C言語のプログラムについてです
-
const char* s1とただのchar s1...
-
文字列内の数字削除
-
c言語でポインタ変数を用いた配...
-
szとlpszの違い
おすすめ情報