Напишите многострочную строку с включенными переменными значениями - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть параметры программы, которые требуют, чтобы у меня была одна отформатированная строка, содержащая значения переменных, введенных в ходе программы.Из-за большого количества данных идеально подходят новые строки для каждой новой точки данных.

Я использую компилятор 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";

, но я продолжаю получать эту ошибку: «выражение должно иметь целочисленный или незавершенный тип enum».

Я основываюсь на этомформат того, как работает оператор cout, и заменяет все «<<» на «+» для конкатенации, а не «следующий оператор», означающий двойную морковь. </p>

Я на правильном пути?Отсутствует что-то очевидное?Можно ли вообще это сделать?

Ответы [ 3 ]

0 голосов
/ 22 ноября 2018

Строковые литералы ("...") имеют тип const char *, а не std :: string, и их оператор + не является конкатенацией, а скорее добавляет адрес к указанному адресу памяти.

Любое использование "... для фактического создания литералов std :: string (но std :: fixed и т. д. по-прежнему не работает) или создания

std::stringstream out; 

, а затем используйте оператор <<, как вы привыкли из std:: соиЬ.Чтобы получить строку из потока строк, используйте функцию-член .str (). </p>

0 голосов
/ 22 ноября 2018

То, что вы делаете, это немного отклонено от что вы думаете, что делает ...

В строке кода используется operator+()производная std::string класса ... и к сожалению это не допускает целых или любых других нестроковых значений внутри него ...

У вас, , однако есть два варианта:

  1. Использование std::to_string() с C++ 11 ...

Пример: ( Не чисто! )

#include <string>
int main() {
    some_function_that_uses_only_strings("ABC" + std::to_string(number));
}
Или просто используйте std::stringstream и std::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());
}
0 голосов
/ 22 ноября 2018

Вы не можете использовать модификаторы setPrecision и fixed при выполнении конкатенации строк.Вы можете сделать это, используя 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...