2013-11-26 3 views
0

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

#include <stdio.h> 
#include <string.h> 


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 должен обновить строку до обратного значения. Это происходит, но только внутри функции, а не в основной функции ...

+1

Я не» Думаю, что это работает: 'char str2 [strlen (str ING)] '. – Batuu

+3

@Batuu C99 имеет массивы переменной длины – Deck

+1

вместо создания str2, просто работайте с исходной строкой и, используя указатели, меняйте символы. – imran

ответ

5

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

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; 
      } 
     } 
} 
+1

Помимо неопределенного поведения этого при передаче пустой строки, это намного ближе, чем любой другой ответ. И даже этот UB может быть адресован с правильной репозиционированием пост-подделки и удалением '-1' из инициализатора' p2'. – WhozCraig

+0

А, танк ты :) – user3032809

+0

@WhozCraig правда, что для меня было весело для меня, как быстро я мог бы это сделать :) – Laurijssen

0

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

+0

Я хочу изменить строку из функции, и я хочу, чтобы входная строка также была затронута в главном. – user3032809

+0

Затем вам нужно изменить строку на месте или создать новую строку, представляющую измененную строку, и вернуть указатель на нее. Простое изменение указателя недостаточно, потому что изменена только копия указателя. – kviiri

0

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

Он будет работать нормально.

0

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

полукокса * strrev (символ *)

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

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

char *a = "HELLO";

strrev(a);

printf("%s", a);

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