2015-10-21 3 views
-2

Итак, у меня есть строка, которая содержит "RGGB", и мне нужно, чтобы она находилась в массиве char для выполнения некоторых операций. Затем мне нужно заменить определенные символы на пустое пространство, например первое 'G', так что мой массив char останется "R GB".Передача строки в массив символов, а затем изменить массив символов в позиции x в C

Как я могу это сделать? До сих пор я попытался это решение:

int main() 
{ 
    string problem="RGGB"; 
    const char *p=problem.c_str(); 
    p[1]=' '; 
    return p; 
} 

Я получаю ошибку:

assignment of read only location *(p + ((sizetype)i))

+0

это очень очевидно, что вы не можете установить что-то в сопзИ вара. вы можете попробовать, char * p = strdup (problem.c_str()); – Adem

+2

Какие операции вам нужно делать на 'string', что вам нужно, чтобы преобразовать его в' char * '? Все, что вы можете сделать с помощью символа 'char *', вы можете использовать с 'string' – NathanOliver

+0

. Я считаю, вы можете попробовать следующее: char * p = & problem [0]; – computador7

ответ

0

p[1]=' ';

не является допустимым, как Const символ * для чтения только указатель.

другими словами, это указатель на const.

запомнить:

When const appears to the left of the *, what's pointed to is constant, and if const appears to the right of the *, the pointer itself is constant. If const appears on both sizes, both are constants.

этот код может работать:

char problem[]="RGGB"; 
char* p = problem; 
p[1]=' '; 
cout<<problem; 
2

Чтобы получить доступ к "INTERAL строку" (я имею в виду const char*) из std::string, есть две функции-члены, предоставляемые: std::string::c_str и std::string::data. До C++ 11 разница заключалась в том, что std::string::data не был связан с возвратом указателя на нуль-оконечный const char*, тогда как std::string::c_str был. Теперь они эквивалентны. И оба возвращают const char*, даже до C++ 11.

Есть несколько подходов к вашей проблеме:

  1. Использование std::strdup или std::str(n)cpy, чтобы дублировать строку и записи в дубликате.

  2. Использовать const_cast. Довольно резкий, но, if it doesn't hurt any rules (FYI, он делает), работает.

  3. Не использовать std::string. Сделайте то, что вы хотите, с помощью char*, а затем по желанию конвертируйте его в std::string.

  4. Просто используйте функциональность std::string.

0

string, класс C++, не предоставляет напрямую изменяемый доступ к его внутренним элементам через char *. Хотя вы можете отбросить const, это опасно, потому что компиляторы могут использовать const как путь оптимизации.

Если вам абсолютно необходимо это сделать, просто используйте массив символов, а не строку или измените содержимое строки с использованием строковых методов.

+0

"string [...] не предоставляет напрямую изменяемый доступ к своим внутренним элементам через char *", а что насчет '& str.at (0)'? – emlai

+0

str.at (0) также предоставляет ссылку на константу. Если содержимое строки было изменено пользователем, это нарушило бы оптимизацию компилятора и совместное использование макета памяти. Вы всегда можете отбросить const, поскольку C++ допускает опасные вещи, но это заставляет вас делать это нарочно. Теперь он может работать на некоторых или даже на всех компиляторах, но он может не работать с будущими компиляторами даже у того же поставщика. – doug

+0

Ум, 'at' также имеет [непостоянную перегрузку] (http://en.cppreference.com/w/cpp/string/basic_string/at). Принимая адрес от этого, вы получаете символ 'char *', который вы можете использовать для изменения строки _совершенно юридически. (до тех пор, пока вы не добавите '' \ 0'' в середине или не измените завершающий '' \ 0'') – emlai

0

Ответ на ваш вопрос:

I need it to be in a char array

Затем поставил его в char массиве:

char problem[] = "RGGB"; 
problem[1] = ' '; 

Проблема решена.

Если, с другой стороны, вы хотите, чтобы решить эту проблему, используя реально C++:

std::string problem = "RGGB"; 
problem.at(1) = ' '; 
Смежные вопросы