2011-12-17 4 views
0

Предположим, что мы имеем char *a ="Mission Impossible";Простая строка Манипуляция

Если мы дадим cout<<*(a+1), то выход i.

Есть ли способ изменить это значение, или это невозможно?

+1

Во-первых, это должно быть 'const char * a =" mission possible "' Что вы ожидаете от вывода? что вы хотите изменить? – balki

+1

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

+0

Что вы подразумеваете под "изменить это значение"? –

ответ

2

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

const char* a = "Mission Impossible"; // const char*, not char*, because we can't 
             // modify its contents 
char buf[80] = {}; // create an array of chars 80 large, all initialised to 0 
strncpy(buf, a, 79); // copy up to 79 characters from a to buf 

cout << *(buf + 1); // prints i 

buf[1] = 'b'; 

cout << *(buf + 1); // prints b 

*(buf + 1) = 't'; 

cout << buf[1]; // prints t 

Тем не менее, если это упражнение не для целей обучения, настоятельно рекомендуется изучить и использовать std::string вместо строк C-стиле. Они превосходят всех по своему усмотрению и приведут к гораздо меньшему разочарованию и ошибкам в вашем коде.

0

Самый простой способ изменить что делает *(a+1)='value_you_want';

Это изменит содержимое указателя (указатель случай а + 1) до установленного значения.

+0

Я полагаю, вы имели в виду '* (a + 1)'? – fge

+0

@fge не должен и должен изменять содержание указателя? Если нет, то это то, что я имел в виду :) –

+2

Это будет работать, если данные определенно изменяемы; если это может быть строковая константа, подобная этой, это не очень хорошая идея. –

1

Нет, char* a фактически доступен только для чтения, и если вы попытаетесь изменить контент, вы получите неопределенное поведение. В идеале вы должны указать a как const char*.

+0

и современный компилятор даже сделают предупреждение по этому коду – Lol4t0

2
char a[] = "Mission Impossible"; 

a[1] = 'x'; 

Строковые литералы не могут быть изменены. Обычно они помещаются в раздел двоичного файла, который будет отображаться только для чтения, поэтому запись в них порождает ошибку. (Это поведение, определяемое реализацией, но в наши дни это наиболее распространенная реализация.)

Объявляя строку как массив символов, она доступна для записи. Другой альтернативой было бы дублирование строкового литерала в кучевую память, либо через malloc, new, либо std::string.

Смежные вопросы