0

文字列を複数の変数型のデータと連結する必要がある場合、通常は次のようにします。

int year = 2013;
float amount = 385.5;

stringstream concat;
string strng;
concat << "I am in the year " << year << " and I don't have in my pocket but the amount " << amount;
strng = concat.str();

cout << strng << endl;

そのコードでわかるように、多くのタイプのデータを連結します: int型、float string はstringyearです。他のプログラミング言語では、演算子を使用して同じことができます。amountI am in the year+

では、質問に戻ります:言語で複数の型の変数からデータを入力する際に​​、文字列 (または型) を連結する以外 の方法はありますか? 両方の言語でできるようにしたいです。stringstreamcharstringCC++

4

2 に答える 2

2

stringstream の使用は確かに非常に便利ですが、唯一の方法ではありません。1 つはsprintf()を使用する方法で、もう 1 つはitoa()や ftoa() などのメソッドを介してすべての値の型を文字列に変換し、標準の文字列連結メソッドstrcat()を使用して複数の文字列を結合する方法です。

于 2013-08-05T21:25:58.037 に答える
1

を使用vsnprintf()して、必要に応じて動的に展開される文字列に出力する一種のラッパーを実装できます。Linux では、C ソリューションは の形式で存在し、次のasprintf()ように解放する必要があるメモリを返しますfree()

char *concat;
asprintf(&concat, "I am in the year %d and I don't have in my pocket but the amount %f",
         year, amount);
std::string strng(concat);
free(concat);

C++ では、RAII がメモリ管理の問題を処理できるため、もう少し使いやすいものを実装できます。

int string_printf (std::string &str, const char *fmt, ...) {
    char buf[512];
    va_list ap;
    va_start(ap, fmt);
    int r = vsnprintf(buf, sizeof(buf), fmt, ap);
    va_end(ap);
    if (r < sizeof(buf)) {
        if (r > 0) str.insert(0, buf);
        return r;
    }
    std::vector<char> bufv(r+1);
    va_start(ap, fmt);
    r = vsnprintf(&bufv[0], bufv.size(), fmt, ap);
    va_end(ap);
    if (r > 0) str.insert(0, &bufv[0]);
    return r;
}


std::string strng;
string_printf(strng,
              "I am in the year %d and I don't have in my pocket but the amount %f",
              year, amount);
于 2013-08-05T21:28:09.220 に答える