#c #string
#c #строка
Вопрос:
Я хочу изменить значение массива символов, когда я использую вот так
char *str;
fun(str);
void fun(char *str) {
str = (char *) ("changed");
}
Он ничего не делает и имеет значение str как null
принимая во внимание, что таким образом
char *str;
fun(amp;str);
void fun(char **str) {
*str = (char **) ("changed");
}
Все идет нормально.
Но у меня есть ограничение на определение функции как void fun(char * str), как изменить значение, используя этот usecase
Комментарии:
1.
*str = (char **) ("changed");
неверно, не приводитеchar *
с(char **)
помощью , первый фрагмент также неверен, вы меняете значение локальной переменной. как изменить значение с помощью этого варианта использования: Использованиеstrcpy
:void fun(char *str) { strcpy(str, "changed); }
.str
должно указывать на выделенное пространство (массив или viamalloc
) с достаточным пространством для хранения «измененных»
Ответ №1:
Я хочу изменить значение массива символов
С fun(char *str)
, str
является указателем. Чтобы изменить значение массива символов, не меняйте указатель str
. Измените содержимое точек памяти str
на.
void fun(char *str) {
// str = (char *) ("changed");
str[0] = 'c';
str[1] = 'h';
str[2] = 'a';
str[3] = 'n';
str[4] = 'g';
str[5] = 'e';
str[6] = 'd';
str[7] = '';
// or simply
strcpy(str, "changed");
}
При вызове убедитесь, что указатель ссылается на доступное пространство
char buffer[100] = "Before";
printf("<%s>n", buffer);
fun(buffer);
printf("<%s>n", buffer);
Ответ №2:
Обычный вариант использования заключается в том, что у вас есть массив, который вы передаете функции. В большинстве случаев выражение типа массива будет преобразовано (или «разложено») в выражение типа указателя, а значением указателя будет адрес первого элемента массива. Пример:
#define SOME_SIZE 20 // Size of the longest string you intend to store; 20 is just an example
void fun( char *str )
{
strncpy( str, "changed", SOME_SIZE );
str[SOME_SIZE] = 0; // make sure string is terminated if SOME_SIZE <= strlen("changed")
}
int main( void )
{
char buf[SOME_SIZE 1] = "foo"; // 1 for 0 terminator
printf( "buf before fun - %sn", str );
fun( buf );
printf( "buf after fun - %sn", str );
return EXIT_SUCCESS;
}
Вы не меняете само значение str
, вы меняете содержимое буфера, на который str
указывает.
Комментарии:
1. Что касается таких строк
"changed"
, я считаю, что длина равна 7, а размер — 8. ИспользованиеSOME_SIZE
в качестве максимальной длины строкиbuf[]
не так понятно. ВозможноSOME_LENGTH
?