Обработка передачи по ссылке массива символов в C

#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 должно указывать на выделенное пространство (массив или via malloc ) с достаточным пространством для хранения «измененных»

Ответ №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 ?