编写包含可变值的多行字符串

时间:2018-11-22 07:03:08

标签: c++ string visual-c++ c++17

我有程序参数,要求我有一个格式化的字符串,其中包含在程序执行过程中输入的变量值。由于涉及的数据量大,因此每个新数据点的换行都是理想的。

我正在使用Visual Studio的C ++编译器,并且已经具有以下标头:

//preprocessors
#include <iostream>
#include "MortCalc.h"
#include <string>
#include <istream>
#include <ctime>
#include <cmath>
#include <iomanip>
#include <vector>
using namespace std;

我试图将值和字符串片段连接起来,像这样:

//write info to string
    string mortgageInfo =
        "       Principal Of Loan:      $" + mortData.principal + "\n"
        + "     Interest Rate:          " + mortData.interest + "%\n"
        + "     Monthly Payment:        $" + monthlyPayment + "\n"
        + "     Total Loan Paid:        $" + total + "\n"
        + "     Total Interest Paid:        $" + interestOverLife + "\n"
        + setprecision(0) + fixed + "\n"
        + "     Years:          " + mortData.term + "\n"
        + "     Start Date of Loan:     " + mortData.dayStart + "/"          
        + mortData.monStart + "/" + mortData.yearStart + "\n"
        + "     End Date of Loan:       " + mortData.dayEnd + "/" 
        + mortData.monEnd + "/" + mortData.yearEnd + "\n";

但我不断收到此错误:“表达式必须具有整数或无作用域的枚举类型”。

我将这种格式基于cout语句的工作原理,并将所有'<<'替换为'+'进行连接,而不是双重胡萝卜所代表的'next statement'。

我走对了吗?缺少明显的东西吗?可以做到吗?

3 个答案:

答案 0 :(得分:2)

进行字符串连接时,不能使用setPrecisionfixed修饰符。 您可以使用std::stringstream来做到这一点:

// In the header
#include <sstream>

// In your function
std::stringstream ss;
ss << "       Principal Of Loan:      $" << mortData.principal << '\n';
ss << "       Interest Rate:          " + mortData.interest + "%\n";
// more lines...
string mortgageInfo = ss.str();

答案 1 :(得分:1)

您正在做的事情与您认为的事情 ...

略有不同

代码行正在使用operator+() derivative of the std::string class ...并且很遗憾不允许在内部使用整数或任何其他非字符串值

您,但是有两个选择:

  1. 使用 C ++ 11 ...
  2. 中的std::to_string()

示例:不干净!

#include <string>
int main() {
    some_function_that_uses_only_strings("ABC" + std::to_string(number));
}
  1. 或者只使用std::stringstreamstd::cout,它本身就是std::istream,因此它的语法是相同的,在语法和问题上都看起来是更好的方法...

示例:

#include <sstream>
int main() {
    std::stringstream some_stream;
    some_stream << first_number << "ABC" << number << std::endl;
    some_function_that_uses_only_strings(some_str.str());
}

答案 2 :(得分:0)

字符串文字(“ ...”)的类型为const char *,而不是std :: string,它们的operator +不是串联的,而是添加到指向内存的地址中。

要么使用“ ...”来实际创建std :: string文字(但是std :: fixed等仍然无法正常工作)或创建

std::stringstream out; 

然后使用运算符<<,就像您习惯使用std :: cout一样。 要从字符串流中取出字符串,请使用.str()成员函数。