私はC++での作業経験があまりありません。むしろ、私はC#でより多くの仕事をしたので、そこで何をしたかについて質問してみたいと思いました。文字列の特定の形式を生成する必要があり、それを別の関数に渡す必要があります。 C#では、次の簡単なコードを使用して簡単に文字列を生成できます。
_string a = "test";
string b = "text.txt";
string c = "text1.txt";
String.Format("{0} {1} > {2}", a, b, c);
_
このような文字列を生成することで、system()
でこれを渡すことができるはずです。ただし、system
は_char*
_のみを受け入れます
私は_Win32 C++
_(C++/CLIではありません)を使用していますが、boost
を使用することはできません。 sprintf()
のようなものは便利に見えますが、sprintf
はstring
をa
、b
、およびc
パラメーターとして受け入れません。私のプログラムでシステムに渡すためにこれらのフォーマットされた文字列を生成する方法はありますか?
sprintf
をstd::string.c_str()
と組み合わせて使用できます。
c_str()
はconst char*
を返し、sprintf
で動作します:
string a = "test";
string b = "text.txt";
string c = "text1.txt";
char* x = new char[a.length() + b.length() + c.length() + 32];
sprintf(x, "%s %s > %s", a.c_str(), b.c_str(), c.c_str() );
string str = x;
delete[] x;
または、サイズがわかっている場合は、事前に割り当てられたchar
配列を使用できます。
string a = "test";
string b = "text.txt";
string c = "text1.txt";
char x[256];
sprintf(x, "%s %s > %s", a.c_str(), b.c_str(), c.c_str() );
C++の方法は、std::stringstream
オブジェクトを次のように使用することです。
std::stringstream fmt;
fmt << a << " " << b << " > " << c;
Cの方法はsprintf
を使用することです。
以下の理由から、Cの方法を正しく行うのは困難です。
もちろん、パフォーマンスが問題になる場合は、Cの方法に戻ることをお勧めします(固定サイズの小さなstringstream
オブジェクトを作成してから破棄することを想像してください)。
完全を期すために、 std::stringstream
:
#include <iostream>
#include <sstream>
#include <string>
int main() {
std::string a = "a", b = "b", c = "c";
// apply formatting
std::stringstream s;
s << a << " " << b << " > " << c;
// assign to std::string
std::string str = s.str();
std::cout << str << "\n";
}
または(この場合)std::string
の独自の文字列連結機能:
#include <iostream>
#include <string>
int main() {
std::string a = "a", b = "b", c = "c";
std::string str = a + " " + b + " > " + c;
std::cout << str << "\n";
}
参考のために:
あなたが本当にCの道に行きたいなら。はい、どうぞ:
#include <iostream>
#include <string>
#include <vector>
#include <cstdio>
int main() {
std::string a = "a", b = "b", c = "c";
const char fmt[] = "%s %s > %s";
// use std::vector for memory management (to avoid memory leaks)
std::vector<char>::size_type size = 256;
std::vector<char> buf;
do {
// use snprintf instead of sprintf (to avoid buffer overflows)
// snprintf returns the required size (without terminating null)
// if buffer is too small initially: loop should run at most twice
buf.resize(size+1);
size = std::snprintf(
&buf[0], buf.size(),
fmt, a.c_str(), b.c_str(), c.c_str());
} while (size+1 > buf.size());
// assign to std::string
std::string str = &buf[0];
std::cout << str << "\n";
}
参考のために:
次に、 Boost Format Library があります。あなたの例のために:
#include <iostream>
#include <string>
#include <boost/format.hpp>
int main() {
std::string a = "a", b = "b", c = "c";
// apply format
boost::format fmt = boost::format("%s %s > %s") % a % b % c;
// assign to std::string
std::string str = fmt.str();
std::cout << str << "\n";
}
他の人から提案されたオプションに加えて、 fmt library をお勧めします。これは str.format
in Python and String.Format
C#で。次に例を示します。
std::string a = "test";
std::string b = "text.txt";
std::string c = "text1.txt";
std::string result = fmt::format("{0} {1} > {2}", a, b, c);
免責事項:私はこのライブラリの著者です。
文字列を連結して、コマンドラインを作成するだけです。
std::string command = a + ' ' + b + " > " + c;
system(command.c_str());
これに追加のライブラリは必要ありません。
完全を期すために、ブースト方法は boost::format
cout << boost::format("%s %s > %s") % a % b % c;
好きなものを選んでください。ブーストソリューションには、sprintf
形式のタイプセーフという利点があります(<<
構文は少し不格好です)。
すでに述べたように、C++の方法は文字列ストリームを使用しています。
#include <sstream>
string a = "test";
string b = "text.txt";
string c = "text1.txt";
std::stringstream ostr;
ostr << a << " " << b << " > " << c;
文字列ストリームオブジェクトからC文字列を取得できることに注意してください。
std::string formatted_string = ostr.str();
const char* c_str = formatted_string.c_str();