Обратная строка с указателями?

Я пытаюсь изменить строку с помощью функции и некоторых указателей, но я не могу заставить эту функцию обновлять исходную строку.

#include  #include  void rev(char* string) { char str2[strlen(string)]; char *p1; char *p2; p1 = string + strlen(string)-1; p2 = str2; while(p1 >= string) *p2++ = *p1--; *p2 = '\0'; p2 = p2 - strlen(string); string = p2; // This codesn't seem to update s1 or s2 } int main(void) { char s1[100] = "What does the fox say?"; char s2[100] = "Titanic sinks"; rev(s1); rev(s2); printf("\n\n%s\n", s1); printf("%s\n", s2); return 0; } 

Функциональность работает, но я не могу заставить строки в основном обновляться с измененной строкой. Imo string = p2 должен обновить строку до обратного значения. Это происходит, но только внутри функции, а не в основной функции …

Вам также необходимо реализовать семантику swap, иначе вы теряете оригинальные символы

  void rev(char *s) { if (s != NULL) { int n = strlen(s) - 1; char *p1 = s; char *p2 = s + max(n, 0); while (p2 > p1) { char temp = *p1; *p1++ = *p2; *p2-- = temp; } } } 

C использует pass по семантике значения с указателями, а также для любых других значений. Когда вы передаете указатель на функцию, ее значение копируется в переменную string . Любые изменения в string будут оставаться локальными для функции (но изменения к указанным данным будут сохранены). Возможно, вы захотите вернуть указатель на измененные данные или изменить строку «на месте».

Ну, вы можете изменить это: string = p2; к этому: strcpy(string, p2); ,

Все будет хорошо.

Вы также можете использовать функцию strrev . В string.h он определяется как:

char * strrev (char *)

Он меняет все символы в строке на обратный порядок, за исключением символа завершающего нули.

Например, приведенный ниже код изменяет массив на обратный порядок и выводит его на экран:

char *a = "HELLO";

strrev(a);

printf("%s", a);