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;

正如我们在该代码中看到的,我们连接了许多类型的数据:yearint类型amountfloat类型stringI am in the year类型。在其他编程语言中,您可以使用运算符来执行相同的操作。+

所以,回到这个问题:除了 stringstream, 连接字符串(charstring类型)之外C还有另一种方法C++吗?我希望能够用两种语言做到这一点。

4

2 回答 2

2

使用 stringstream 当然很方便,但不是唯一的方法。一种方法是使用sprintf() ,另一种方法是通过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 回答