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

тому я намагаюся перетворити ціле число в рядок, а потім додати рядок до вже існуючого const char *. Але, як згадувалося, я отримую цю помилку:

Помилка: вираз повинен мати цілісний чи неперерваний тип переліку.

  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, вулиця В'язів до 946, Elderberry Road і очікуючи, що Elderberry Road приєднається до вулиці Елм.
додано Автор 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 для всіх рядків.

Крім того, вам потрібно використовувати const кваліфікатор, який також повинен надати деякі підказки про те, що вказівник вказує на константа , і тому не може бути змінений (включаючи доданий ).


І в цьому випадку вам не потрібна будь-яка тимчасова змінна objDimension або objDimStr (якщо ви не використовуєте їх пізніше в коді)

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

Тут доповнення працює, оскільки існує перевантажений оператор + функція , яка приймає правильні аргументи у правильному порядку, і повертає новий об'єкт std :: string .

2
додано
@ Xyber101 Ви, здається, знаєте про функцію-члена c_str() ...
додано Автор Some programmer dude, джерело
Гаразд, але після цього я залишуся з рядком. Але, я потребую змінної типу char char *, щоб мати можливість передавати її функції API для відображення рядка на екрані. Підпис функції: int RhinoMessageBox (const char * повідомлення, const char * title, тип UINT). Отже, як я можу отримати рядок, а потім передати його у відповідну функцію?
додано Автор 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 з нею.

1
додано
@ Xyber101: Тоді ви можете зробити objDimStr + = objDim + objDimStr; . Тоді objDimStr буде містити те, що вам потрібно в правильному порядку.
додано Автор P.W, джерело
Гаразд, я чудово розумію, що ви говорите, рядок буде додано до рядка, а не до покажчика. Але, мені потрібна змінна char *, тому що це те, що я повинен перейти до функції API для відображення рядка на екрані. Підпис функції: int RhinoMessageBox (const char * повідомлення, const char * title, тип UINT)?
додано Автор Xyber 101, джерело
Знову ж таки, це дасть мені рядок, чи не так? Що мені потрібно, це символ * з даними рядка. Як це зробити? Вибачте, я новачок у C ++ і ця річ вказівника мене дуже прив'язала :(
додано Автор Xyber 101, джерело

Ви оголошуєте objDim конст, що означає, що НЕ може бути змінено під час виконання.

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 не був std :: string , а потім використовувати оператор +, щоб об'єднати? загалом, const не може бути змінений, вам знадобиться нова змінна для утримання конкатанації https://msdn.microsoft.com/en-us/library/07x6b05d .aspx :

При зміні оголошення даних ключове слово const визначає це   об'єкт або змінна не змінюється.

0
додано
Це не відповідає на питання, це більше коментар.
додано Автор Some programmer dude, джерело
IT KPI C/С++ новым годом
IT KPI C/С++ новым годом
747 учасників

Чат обсуждения С/С++. - Вопросы "напишите за меня лабу" - это оффтоп. - Оффтоп, флуд, оскорбления и вбросы здесь не приняты. - За нарушение - предупреждение или mute на неделю. - За спам и рекламу - ban. Все чаты IT KPI: https://t.me/itkpi/1147