Оператор конкатенации в C ++? - PullRequest
1 голос
/ 03 февраля 2011

У меня есть приложение, в котором мне нужно объединить строки внутри переменной, например:

int int_arr[4];
int_arr[1] = 123;
int_arr[2] = 456;
int_arr[3] = 789;
int_arr[4] = 10;
std::string _string = "Text " + int_arr[1] + " Text " + int_arr[2] + " Text " + int_arr[3] + " Text " + int_arr[4];

Это дает мне ошибку компиляции

Error C2210: '+' Operator cannot add pointers" on the second string of the expression.

Насколько я могу судить, я объединяю строковые литералы и целые числа, а не указатели.

Есть ли другой оператор конкатенации, который я должен использовать? Или это выражение совершенно неверно и должно найти другой способ реализации этого?

Кстати, я использую Visual Studio 2010

Ответы [ 4 ]

6 голосов
/ 03 февраля 2011

Ни C, ни C ++ не позволяют объединять const char * и int. Даже C ++ std::string не объединяет целые числа. Вместо этого используйте потоки:

std::stringstream ss;
ss << "Text " << int_arr[1] << " Text " << int_arr[2] << " Text " << int_arr[3] << " Text " << int_arr[4];
std::string _string = ss.str();
2 голосов
/ 03 февраля 2011

Вы можете сделать это в Java , поскольку он автоматически использует метод toString() для каждой детали.

Если вы хотите сделать то же самое в C ++, у вас будетчтобы явно преобразовать эти целые числа в строки, чтобы это работало.

Что-то вроде:

#include <iostream>
#include <sstream>

std::string intToStr (int i) {
    std::ostringstream s;
    s << i;
    return s.str();
}

int main (void) {
    int var = 7;
    std::string s = "Var is '" + intToStr(var) + "'";
    std::cout << s << std::endl;
    return 0;
}

Конечно, вы можете просто использовать:

    std::ostringstream os;
    os << "Var is '" << var << "'";
    std::string s = os.str();

, которыйнамного проще.

1 голос
/ 03 февраля 2011

Строковый литерал становится указателем в этом контексте.Не std::string.(Ну, чтобы быть педантично правильным, строковые литералы являются символьными массивами, но имя массива неявно преобразуется в указатель. Одна предопределенная форма оператора + принимает указатель в виде левого аргумента и интегральный правый аргумент, которыйявляется лучшим соответствием, поэтому здесь происходит неявное преобразование. Ни одно пользовательское преобразование не может иметь приоритет над этим встроенным преобразованием в соответствии с правилами перегрузки C ++.).

Вы должны изучить хороший C ++книга, у нас есть список здесь, на SO.

0 голосов
/ 03 февраля 2011

Строковый литерал - это выражение, возвращающее указатель const char*.

std::stringstream _string_stream;
_string_stream << "Text " << int_arr[1] << " Text " << int_arr[2] << " Text " << int_arr[3] << " Text " << int_arr[4];
std::string _string = _string_stream.str();
...