34

私は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受け入れられません。プログラムのシステムに渡すためにこれらのフォーマットされた文字列を生成する方法について何か提案はありますか?stringabc

4

7 に答える 7

44

C ++の方法は、std::stringstreamオブジェクトを次のように使用することです。

std::stringstream fmt;
fmt << a << " " << b << " > " << c;

Cの方法は、を使用することsprintfです。

Cの方法は、次の理由から正しく理解するのが困難です。

  • 安全ではないタイプです
  • バッファ管理が必要

もちろん、パフォーマンスが問題になる場合は、Cウェイにフォールバックすることをお勧めします(固定サイズの数百万の小さなstringstreamオブジェクトを作成してから破棄することを想像してください)。

于 2012-05-02T08:19:53.263 に答える
30

完全を期すために、次を使用できます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.begin(), buf.begin()+size);
    std::cout << str << "\n";
}

参考のために:


次に、BoostFormatLibraryがあります。あなたの例のために:

#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";
}
于 2012-05-02T08:26:49.143 に答える
18

他の人が提案したオプションに加えて、PythonやC#と同様の文字列フォーマットを実装するfmtライブラリをお勧めします。次に例を示します。str.formatString.Format

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);

免責事項:私はこのライブラリの作者です。

于 2012-12-23T00:27:40.033 に答える
10

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() );
于 2012-05-02T08:16:35.710 に答える
3

完全を期すために、ブーストの方法は使用することですboost::format

cout << boost::format("%s %s > %s") % a % b % c;

好きなものを選んでください。sprintfブーストソリューションには、フォーマットによる型安全性の利点があります(<<構文が少し不格好な場合)。

于 2012-05-02T08:26:44.897 に答える
2

すでに述べたように、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();
于 2012-05-02T08:28:01.907 に答える
2

文字列を連結してコマンドラインを作成するだけです。

std::string command = a + ' ' + b + " > " + c;
system(command.c_str());

このために追加のライブラリは必要ありません。

于 2012-05-02T16:22:12.180 に答える