用C++连接字符串

Grz*_*nio 1 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);
}
Run Code Online (Sandbox Code Playgroud)

用于:

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());
}
Run Code Online (Sandbox Code Playgroud)

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

Art*_*yom 14

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

我会建议:

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

sprintf的缓冲区溢出是不安全的,而是使用C99 snprintfstd::stringstream


T.E*_*.D. 13

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

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

std::string result = copula.toString() + "(" + left.toString() + "," 
                   + right.toString() + ")";
Run Code Online (Sandbox Code Playgroud)


Ano*_*on. 5

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