Как вернуть строку, содержащую переменные string / int - PullRequest
6 голосов
/ 28 ноября 2011

Например, если у меня есть эта маленькая функция:

string lw(int a, int b) {    
    return "lw $" + a + "0($" + b + ")\n";
}

.... и сделать вызов lw(1,2) в моей основной функции, я хочу, чтобы он возвратил "lw $1, 0($2)".

Но я получаю сообщение об ошибке: invalid operands of types ‘const char*’ and ‘const char [11]’ to binary ‘operator+’

Что я делаю не так?Я скопировал пример из класса и изменил его, чтобы он соответствовал моей функции.

Ответы [ 5 ]

11 голосов
/ 28 ноября 2011

Вы пытаетесь объединить целые числа в строки, и C ++ не может преобразовать значения таких разных типов.Лучше всего использовать std::ostringstream для построения строки результата:

#include <sstream>

// ...

string lw(int a, int b)
{
    ostringstream os;
    os << "lw $" << a << "0($" << b << ")\n";
    return os.str();
}

Если у вас Boost , вы можете использовать Boost.Lexical_cast:

#include <boost/lexical_cast.hpp>

// ...

string lw(int a, int b)
{
    return
        string("lw $") +
        boost::lexical_cast<std::string>(a) +
        string("0($") +
        boost::lexical_cast<std::string>(b) +
        string(")\n");
}

А теперь с C ++ 11 и более поздними версиями std::to_string:

string lw(int a, int b)
{
    return
        string("lw $") +
        std::to_string(a) +
        string("0($") +
        std::to_string(b) +
        string(")\n");
}
2 голосов
/ 28 ноября 2011

Используйте поток ostring:

#include <sstream>
...
string lw(int a, int b) {
    std::ostringstream o;
    o << "lw $" << a << "0($" << b << ")\n";
    return o.str();
}
2 голосов
/ 28 ноября 2011
#include <sstream>

string lw(int a, int b) {    
    std::string s;
    std::stringstream out;
    out << "lw $" << a << "0($" << b << ")" << endl;
    s = out.str();
    return s;
}
1 голос
/ 28 ноября 2011

Вы не можете добавлять строковые литералы (например, "привет") к целым числам. Это то, что компилятор говорит вам. Это частичный ответ на ваш вопрос. Пожалуйста, смотрите как выполнить то, что вы хотите в других сообщениях.

0 голосов
/ 28 ноября 2011

Чтобы понять этот вопрос, вы должны знать, что в C ++ строковые литералы, такие как "lw $", обрабатываются как const char[] как унаследованные от языка Си.Однако это означает, что вы получаете только те операторы, которые определены для массивов, или в этом случае массив-деградирует до указателя.

Итак, что происходит, если у вас есть строковый литерал, а затем добавляется целое число кэто, создавая новый указатель.Затем вы пытаетесь добавить другой строковый литерал, который снова ухудшается до char*.Вы не можете добавить два указателя вместе, что приведет к появлению ошибки, которую вы видите.

Вы пытаетесь отформатировать целые числа в строковый формат с некоторым разделителем текста.В C ++ канонический способ сделать это с помощью строковых потоков:

#include <sstream>

string lw(int a, int b)
{
    std::ostringstream os;
    os << "lw $" << a << "0($" << b << ")\n";
    return os.str();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...