Я получаю ошибку времени компиляции при добавлении строки в const char * в C ++?

поэтому я пытаюсь преобразовать целочисленное значение в строку, а затем добавить строку к уже существующему const char *. Но, как уже упоминалось, я получаю эту ошибку:

error: выражение должно иметь интегральный или неперечисленный тип перечисления.

  objDim + = objDimStr.c_str ();
 

Любые идеи почему? Мой код выглядит следующим образом:

    const char* objDim = "The object dimension is: ";
    int objDimension = geo->Dimension();
    std::string objDimStr = std::to_string(objDimension);
    objDim += objDimStr.c_str();
0
Это адреса, так что это как добавить 1428, Elm Street к 946, Elderberry Road и ожидать, что Elderberry Road присоединяется к Elm Street.
добавлено автор molbdnilo, источник

6 ответы

objDim is a pointer. When you add to the pointer, you will add to the pointer itself and not append anything to the data it points to.

И вы не можете добавить все к указателю, в основном только целые значения. И добавление двух указателей, подобных вам, вообще не имеет смысла (поэтому это недопустимо).

Если вы хотите добавить строки, используйте std :: string для строк all .

Кроме того, вам нужно использовать квалификатор const , также следует дать некоторые подсказки о том, на что указывает указатель, constant и, следовательно, не может быть изменен (в том числе добавлен ).


И в этом случае вам не нужна какая-либо временная переменная objDimension или objDimStr (если вы не используете их позже в коде):

std::string objDim = "The object dimension is: " + std::to_string(geo->Dimension());

Здесь добавление работает, потому что есть перегруженный operator + функция , которая принимает правильные аргументы в правильном порядке и возвращает новый объект std :: string .

2
добавлено
@ Xyber101 Ну, вы уже знаете о функции члена c_str() ...
добавлено автор Some programmer dude, источник
Хорошо, но после этого у меня останется строка. Но мне нужна переменная типа const char *, чтобы передать ее функции API для отображения строки на экране. Подписи функции: int RhinoMessageBox (const char * message, const char * title, UINT type). Итак, как мне получить строку, а затем передать ее в функцию подходящим образом?
добавлено автор Xyber 101, источник

Я предполагаю, что вы ожидали получить конкатенацию строк. Нет, это не так, как это работает. objDim - это только указатель на немодифицируемую область памяти, содержащую символы. Единственное возможное применение оператора + = к нему, которое было бы скомпилировано, это если вы увеличивали его на несколько символов:

objDim += 11;
std::cout << objDim << '\n';//prints "dimension is: ";

Чтобы объединить строки, вы можете:

  1. Either assign the result to a string object:

    std::string result = objDim + objDimStr;
    

    (Note the absence of c_str anywhere: you cannot sum two pointers, but there's an overload that can prepend a char pointer to a std::string.)

  2. Or give proper type to objDim;

    std::string objDim{"The object dimension is: "};
    objDim += objDimStr;
    
2
добавлено

objDim is not an std::string but a pointer, so your concatenation operator (+) which is defined for std::string will not work on it.

Определите его как std :: string , и вы сможете использовать его для конкатенации других std :: string s.

1
добавлено
@ Xyber101: Тогда вы можете сделать objDimStr + = objDim + objDimStr; . Затем objDimStr будет содержать то, что вам нужно в правильном порядке.
добавлено автор P.W, источник
Хорошо, я прекрасно понимаю, что вы говорите, строка будет добавлена ​​только с строкой, а не с указателем. Но мне нужна переменная char *, так как я должен перейти к функции API, чтобы отобразить строку на экране. Подписи функции: int RhinoMessageBox (const char * message, const char * title, UINT type)?
добавлено автор Xyber 101, источник
Опять же, это даст мне строку, не так ли? Мне нужен символ char * с данными строки. Как мне это сделать? Извините, я новичок в C ++, и эта вещь-указатель меня очень привязала :(
добавлено автор Xyber 101, источник

Вы объявляете objDim как const, а это означает, что во время выполнения он может НЕ .

You should either use std::string instead of const char* or use strncat, as seen here: Append to the end of a Char array in C++

1
добавлено
objDim += objDimStr.c_str();

Здесь вы добавляете один указатель на другой вместо конкатенации строки. Вам нужно использовать std :: string для конкатенации, например:

const char* objDim = "The object dimension is: ";
int objDimension = geo->Dimension();
std::string objDimStr = objDim;
objDimStr += std::to_string(objDimension);
std::cout << objDimStr << std::endl;
0
добавлено

почему нет objDim be std :: string , а затем использовать оператор + для объединения? в общем случае константа не может быть изменена, вам понадобится новая переменная для хранения конкатенации от https://msdn.microsoft.com/en-us/library/07x6b05d .aspx :

При изменении объявления данных ключевое слово const указывает, что   объект или переменная не изменяются.

0
добавлено
Это не отвечает на вопрос, это скорее комментарий.
добавлено автор Some programmer dude, источник
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest