2012-03-31 2 views
0

Некоторые функции C могут изменять строковое значение без того, чтобы передать его адрес. Например:Как изменить строковое значение без пароля pass ** в качестве параметра?

char * s = "foo\0"; 
tobaa(s); /* Now foo is modified to something like "baa" */ 
printf("%s", s); /* baa */ 

Как я это?

+2

Вам не нужно явно помещать '\ 0' в конец строкового литерала. Это делается автоматически. И измените 'char * s' на' char s [] ' – Shahbaz

+0

@Shahbaz: Спасибо за ваше уведомление. Это стандарт C? и все компиляторы C делают это? – Jack

+0

Да, это стандарт – Shahbaz

ответ

4

Простой:

void tobaa(char *s) 
{ 
    strcpy(s, "baa"); 
} 

Кроме того, дополнительный \0 символ не является необходимым, он добавляется автоматически. Кроме того, убедитесь, что вы передаете изменяемый буфер в tobaa или вы вызываете UB.

+0

Что делать, если мне нужно выделить память для внутри функции? , например. 'string str = createFileName (fileNumber); s = (char *) malloc (sizeof (char) * (str.length() + 1)); strcpy (s, str.c_str()); ' В главном' char * s = NULL; ' – syfantid

4

Первое, что нужно упомянуть, заключается в том, что ваш код включает неопределенное поведение; вам не разрешается изменять строковые литералы.

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

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