2014-01-22 2 views
0

Я уверен, что это простой вопрос для большинства, но у меня возникают проблемы с попыткой выяснить, почему я не могу манипулировать этим укусом, и еще лучше, как я должен это делать , Так, например, мы имеем:Как манипулировать символьной строкой, указывающей на

char *str1="Hello World"; 

Все, что я хочу сделать, это манипулировать строку, которая в настоящее время, на который указывает «str1». Например, как показано ниже, я мог бы выводить строку и видеть оригинал. Тогда я мог бы добавить туда нулевой символ и сократить его.

cout << str1 << '\n'; 
str1[5] = '\0'; 
cout << str1; 

Я также попытался:

cout << str1 << '\n'; 
*(str1+4) = '\0'; 
cout << str1; 

В любом случае я надеюсь увидеть что-то вроде этого:

Hello World 
Hello 

Ошибка я получаю в обоих случаях, когда Я пытаюсь изменить строку. Я знаю, что было бы проще просто объявить str1 как массив (char str1[] = ....), но мне дано ограничение на необходимость использования ужасного char *

+3

Вы не можете изменить строковый литерал. К счастью, присвоение 'char *' устарело в C++ 11. – juanchopanza

ответ

4

Строковые литералы хранятся в постоянной памяти. Вы не можете их изменить. Фактически, в современном C++, пытающемся инициализировать str1, вы сделаете ошибку. Это должно быть const char*:

const char* str1 = "Hello World"; 

Это дает понять, что вы не должны модифицировать char с.

Если вы хотите получить копию строки, которую вы можете манипулировать, вы должны сделать str1 массив:

char str1[] = "Hello World"; 

При инициализации массива строкового литерала, символы копируются в массив.

+0

Спасибо за ответ! Итак, означает ли это, что нет возможности сохранить редактируемую копию str1, если она определена как char *? – TrapLevel

+0

@TrapLevel Конечно, вам придется скопировать символы из строкового литерала в массив. Это то, что вторая строка, которую я дал, выполняется автоматически, но вы можете сделать это вручную. –

-1

Почему вы не можете изменить str1 было ясно объяснено Джозефом. Но если вы хотите его изменить, вы можете использовать что-то вроде этого:

char *str = "hello"; 
char *ptr = new char[strlen(str)+1]; 
strcpy(ptr,str); 
ptr[2] = 'd'; 
str = ptr; 

Надеюсь, это решает вашу проблему.

+1

'ptr' уже будет завершен нулевым символом после вызова' strcpy'. – dreamlax

+0

Также, если этот подход используется, вы должны позаботиться о том, чтобы использовать 'delete'. – dreamlax

+0

Большая часть кода может быть заменена одной строкой, вызывающей strdup(), и она не отвечает на вопрос.-1 – EJP

0

Итак, после всей помощи, которую я получил от вас, я сначала определил длину строк, инициализируя массив одного и того же размера + 1, а затем итерируя через оригинал, чтобы сохранить его в массиве , Тогда я смог манипулировать им, как я доволен.

int someFunc(char *inpStr){ 
    int counter = 0; 

    //Find the length of the input string 
    while(inpStr[counter]!='\0'){counter++;} 

    //Input initialize an array of same size 
    char strArray[counter+1]; 

    //Copy whats in the char * to the array and make sure it ends with null 
    for(int i=0;i<=counter;i++){strArray[i]=*(inpStr+i);} 
    strArray[counter]='\0'; 

    ..... 
return 0; 
} 

Спасибо за помощь!

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