質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

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

Q&A

解決済

3回答

6918閲覧

C++ 文字列同士を結合させたいです。

mypace

総合スコア45

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

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

0グッド

0クリップ

投稿2019/01/24 04:07

C++ でchar[] へ格納した文字列を、std::stringに渡し、
std::string同士を連結させたいです。
以下のコードのように文字列 += 文字列 と記述し、
OpenCVのimwrite関数で保存したいのですが、
文字列結合ができておらず、.jpgファイル名が結合できていない状態となります。
なぜ結合できないのかご教授いただきたく思います。

C++

1char disparityMapWriteFilePath[MAX_PATH] = ""; 2char disparityMapWriteDataName[64] = ""; 3//disparityMapWriteFilePathにexeディレクトリパス内にある指定ファイルパスを入力 4//パスを確認しました。 5sprintf_s(disparityMapWriteDataName, 64, "\dispMap_%d_%d_%d_%d_%d_%d_%d_%d.jpg", preType, preSize, preCap, URatio, speckRange, speckWin, blockSize, numDisp); 6std::string filename( disparityMapWriteDataName, sizeof(disparityMapWriteDataName)/sizeof(disparityMapWriteDataName[0])); 7std::string filepath( disparityMapWriteFilePath, sizeof(disparityMapWriteFilePath)/sizeof(disparityMapWriteFilePath[0])); 8filepath += filename; //結合できるはずだけど… 9cv::imwrite(filepath, disparity_map); //exeディレクトリ指定ファイルパスしか入ってない 10

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

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

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

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

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

ardin

2019/01/24 04:31

宣言時のfilepathに何が入っていますか? 投稿するためにそこは抜いているだけでしょうか?投稿部分だけ見ると空に見える
guest

回答3

0

こんにちは。

std::stringはC言語文字列と異なり、null終端ではありません。(つまり、'\0'も格納できます。)
ですので、kaztoさんが回答されているように、filepathの長さはMAX_PATHになっていますので、その後ろにfilenameが結合されます。

そして、恐らくOpenCVはfilepathからC言語文字列(c_str)を取り出すので、結合後のfilepathの最初のnull文字で文字列が終わってしまうのだろうと思います。結果、結合できていないかのように見えます。

C++

1#include <iostream> 2#include <cstdlib> 3 4#define MAX_PATH 260 5 6int main() 7{ 8 char disparityMapWriteFilePath[MAX_PATH] = "/to/path/\0<AFTER NULL CHAR>"; 9 char disparityMapWriteDataName[64] = "filename"; 10 std::string filename( disparityMapWriteDataName, sizeof(disparityMapWriteDataName)/sizeof(disparityMapWriteDataName[0])); 11 std::string filepath( disparityMapWriteFilePath, sizeof(disparityMapWriteFilePath)/sizeof(disparityMapWriteFilePath[0])); 12 filepath += filename; //結合できるはずだけど…} 13 std::cout << "filepath.c_str():" << filepath.c_str() << "\n"; 14 std::cout << "filepath :" << filepath << "\n"; 15} 16// Wandboxでの実行結果 17filepath.c_str():/to/path/ 18filepath :/to/path/<AFTER NULL CHAR>filename

wandbox

上記ケースで、disparityMapWriteFilePathの初期化で指定した文字列より長い部分は0で初期化(ゼロ初期化)されます。そして、恐らくstd::coutはnull文字を単に出力しないだけだろうと思います。

投稿2019/01/24 04:59

Chironian

総合スコア23272

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

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

0

ベストアンサー

C++

1std::string filename( disparityMapWriteDataName, sizeof(disparityMapWriteDataName)/sizeof(disparityMapWriteDataName[0])); 2std::string filepath( disparityMapWriteFilePath, sizeof(disparityMapWriteFilePath)/sizeof(disparityMapWriteFilePath[0]));

ここでstd::stringのコンストラクタにサイズ指定しているのが意図しない動作に繋がっていそうです。
通常std::stringは与えたcharの配列がヌル文字で終端されていればそこまででサイズ確保してくれます。

実際動かしていないため確実ではありませんが、filepathはMAX_PATH分確保されてしまっています。
一方、MAX_PATH分を文字列として受け取ってしまっているため、後半は\0埋めされているのか不定な文字が入っているのか、想定した文字列より長いバッファが確保されてしまい、連結しても途中にヌル文字が登場するため、ファイルパスとしてはそこまでになってしまう、ということが想像できます。

対処としては、サイズを与えないこと、になります。

投稿2019/01/24 04:25

kazto

総合スコア7196

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

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

mypace

2019/01/24 08:48

ありがとうございました。 文字列結合できました。
guest

0

filepath宣言時に中身とサイズ(260)も確保しているが、その確保している中身はなんからの文字列(charに入れたもの)と終端文字相当。
厳密にはfilepathには追加されています。260以降に。
しかし、宣言時に終端文字が入っているため、それが見えません。

C++

1 std::string filepath(disparityMapWriteFilePath);

だけでよいかと。
同時に

C++

1 std::string filename(disparityMapWriteDataName);

でよいような。

投稿2019/01/24 04:48

ardin

総合スコア546

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問