用C ++连接字符串

时间:2010-01-21 21:26:48

标签: c++ linux g++

我是一个缺乏经验的C ++程序员,所以这个问题可能很基础。我正在尝试获取copula的文件名:

string MonteCarloBasketDistribution::fileName(char c)
{
    char result[100];
    sprintf(result, "%c_%s(%s, %s).csv", copula.toString().c_str(), left.toString().c_str(), right.toString().c_str());
    return string(result);
}

用于:

MonteCarloBasketDistribution::MonteCarloBasketDistribution(Copula &c, Distribution &l, Distribution &r): copula(c), left(l), right(r)
{
    //.....
    ofstream funit;
    funit.open (fileName('u').c_str());

    ofstream freal;
    freal.open (fileName('r').c_str());
}

但是,创建的文件具有垃圾名称,主要由奇怪的字符组成。知道我做错了什么以及如何解决它?

7 个答案:

答案 0 :(得分:14)

sprintf有4个占位符,而你只提供3个参数。

我建议:

string MonteCarloBasketDistribution::fileName(char c) {
   std::ostringstream result;
   result << c <<"_"<<copula<<'('<<left<<", "<<right<<").csv";
   return result.str();
}

您的sprintf对缓冲区溢出不安全,请使用C99 snprintfstd::stringstream

答案 1 :(得分:13)

由于你所有的东西都是以字符为基础的,因此使用sprintf是有点傻。

C ++程序员应该做的事情更多的是:

std::string result = copula.toString() + "(" + left.toString() + "," 
                   + right.toString() + ")";

答案 2 :(得分:5)

您的格式字符串中有四个说明符,但只提供三个附加参数。

答案 3 :(得分:4)

由于您似乎使用std :: string,因此根本不需要使用sprintf。 std :: string使用重载操作符很简单,因此可以使用+ =来连接字符串。我认为+也可以,所以只需“添加”std :: strings。

答案 4 :(得分:3)

唯一看起来完全被破坏的是你只向你的sprintf传递了3个数据参数,但它预计会有4个(%c,%s,%s,%s)

答案 5 :(得分:3)

Boost的formatting library比printf和朋友更安全。

#include <boost/format.hpp>
string MonteCarloBasketDistribution::fileName(char c)
{
    return boost::str( boost::format("%c_%s(%s, %s).csv")
        % c % copula.toString() % left.toString() % right.toString() );
}

或者,或者:

#include <boost/format.hpp>
string MonteCarloBasketDistribution::fileName(char c)
{
    return boost::str( boost::format("%1%_%2%(%3%, %4%).csv")
        % c % copula.toString() % left.toString() % right.toString() );
}

对于后一个例子,Boost知道%1%是一个字符,%2%到%4%是通过“查看”通过%运算符传入的参数类型的字符串。

答案 6 :(得分:2)

假设toString()返回std::string

此:

  

sprintf(结果,“%c_%s(%s,%s).csv”,   copula.toString()。c_str(),   left.toString()。c_str(),   right.toString()c_str());

......应该是:

  

sprintf(结果,“ %s _%s(%s,%s).csv”,   copula.toString()。c_str(),   left.toString()。c_str(),   right.toString()c_str());