🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

2902閲覧

std::vector<const char*> tmp;変数に文字列を代入したい。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/03/05 04:20

提示コードですが////コメント部のコードですがどうすればstd::vector<const char*>型変数に文字列を代入出来るのでしょうか?
色々試しましたがわかりません。

cpp

1#include "Game_Scene.hpp" 2#include "Stage.hpp" 3#include "Control.hpp" 4 5#include <filesystem> 6#include <map> 7 8namespace fs = std::filesystem; 9 10//コンストラクタ 11Game_Scene::Game_Scene(Scene_Type t, Entry* e) : Scene_base(t, e) 12{ 13 Owner = e; //Entry クラス 14 15 16 // ##### スプライトをロード ##### 17 std::vector<int> SpriteList; //スプライトリスト 18 std::vector<const char*> NameList; //スプライトリスト 19 20 21 char current[200]; 22 strcpy_s(current,sizeof(current),fs::current_path().string().c_str()); 23 strcat_s(current,sizeof(current), "/Sprite_Data/"); 24 25 //スプライト読み込み 26 printf("Path : %s\n",current ); 27 for (fs::directory_iterator itr = fs::directory_iterator(current); itr != fs::directory_iterator(); itr++) 28 { 29 printf("%s\n",itr->path().string().c_str()); 30 31 SpriteList.push_back(Owner->LoadSprite(itr->path().string().c_str())); //スプライト 32 //NameList.push_back(); //名前 33/////////////////////////////////////////////////////////////////////////////////////////////////////////// 34 strcpy_s(NameList.back(), sizeof(itr->path().filename().string().c_str()), itr->path().filename().string().c_str()); 35/////////////////////////////////////////////////////////////////////////////////////////////////////////// 36// NameList.push_back(itr->path().filename().string().c_str()); //名前 37 } 38 39 40 41 42 // ##### コンポーネント ##### 43 stage = std::make_shared<Stage>(Owner,SpriteList); //マップ描画 44 control = std::make_shared<Control>(Owner,SpriteList,NameList); //操作 45 46 47 48}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2021/03/05 04:38

(std::vector< std::string > 等ではなく,あえて std::vector< const char* > とする意図が不明ですが) vectorの要素と成る個々の const char * が指す領域をどのように確保するつもりなのか?という考えを示す必要があるでしょう.
退会済みユーザー

退会済みユーザー

2021/03/05 04:40

そこがわからないのですがどうすればconst char*で出来るのでしょうか?
maisumakun

2021/03/05 04:44

どうしてconst char *でやらなければならないのでしょうか?
退会済みユーザー

退会済みユーザー

2021/03/05 04:48

なんとなく挑戦したいので
maisumakun

2021/03/05 05:01

(文字列リテラル専用で運用するのでなければ)動的に個数の変わるvectorと、生のchar*の相性は最悪です。 「なんとなく」ぐらいで、明確にその構造を取るべき理由がないのであれば、やめておくことを強くおすすめします。
fana

2021/03/05 05:04 編集

> なんとなく挑戦したい そういうことは,それだけを試してみる用の小さなテストプログラムとかの上でやってみれば良いことなのではないでしょうか. 「const char* で自前で頑張るとしたら,どういうことになるのか」を知っておくのは良いことかもしれませんが,それを本物のプログラム(?)で使い続ける必要はない.
episteme

2021/03/05 10:50

「色々試しましたが」からは何の情報も得られません。
guest

回答1

0

ベストアンサー

std::vector<int> Vals;
みたいなのに要素を追加するのと一緒です.例えば,

C++

1int NewElemValue = 10; //vector<int>に突っ込むデータはint型 2Vals.push_back( NewElemValue );

とかするでしょう.

std::vector<const char*> NameList;
ならば,同様に,

C++

1const char *NewElemValue = ???; //vector<const char*>に突っ込むデータは const char* 型 2NameList.push_back( NewElemValue );

という感じです.
で,???の部分を一体どうするつもりなんですか?
という.(そこの計画は,あなたにしかわからないところ.)

vectorの要素の型が const char* というポインタなので,おそらくは,何らかの領域を指し示すポインタ値にすることを考えておられるのだろう,と想像しますが.
例えば,

C++

1//(1)なんか十分なサイズのバッファを用意して… 2char *pMemoryBuffer = new char[ 100 ]; 3 4//(2)そのバッファに何かデータを入れるなりして… 5//(略)パスをコピーする? 6 7//(3)バッファの先頭を示すポインタ値をvectorに突っ込む 8NameList.push_back( pMemoryBuffer ); 9 10//で,newで確保したバッファはいつdelete[] するのだろうか?

みたいな話を考えているのでしょうか?
(これだと上記コード末尾のコメントのように,面倒な話がついて回ることになりますが)

投稿2021/03/05 04:54

fana

総合スコア11985

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/03/05 04:57

単に文字列リテラルを入れる、みたいな用事なら特に問題はないかと思いますが、意図がわからない以上コメントしづらいですね。
fana

2021/03/05 04:58 編集

作ったデータの用途が不明なので,そもそも何のために const char* 型なのか謎ですが. 「ファイルパス」の情報が必要だというなら,path型にでもしておけば良いのではないかと思うし, 「文字列」の形で良いのなら,string型にすればいい.
fana

2021/03/05 05:01 編集

> 単に文字列リテラルを入れる、みたいな用事なら特に問題はないかと思いますが ...(略) あえて const char* で行くのは,そういう用途の時くらいかな,と思いますね. 対して,質問文のコードはどう見てもリテラルを指す用途ではないので,徒労感がすごいです.
fana

2021/03/05 05:35

どこかに char BigBuffer[ わりとたくさん ]; みたいなのがあらかじめ用意されていて,vectorの要素群はその各所を指し示す… …みたいな場合も考えられるか.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問