Odwracanie łańcuchów a przydział pamięci

0

Cześć, mam pytanie odnośnie przydzielenia pamięci, ale najpierw kod-

//odwraca zawartosc lancucha i zapisuje ja w tym samym lancuchu.
#include <stdio.h>
#include <string.h>
void invert(char *s, int n);
int main(void){
    int n;
    char *string;

    puts("Wpisz dowolne zdanie, program je odwroci.");
    gets(string);
    n=strlen(string);
    puts("Wpisales:");
    puts(string);
    invert(string, n);
    puts("Po odwroceniu kolejnosci:");
    puts(string);
}

void invert(char *s, int n){
    int i;
    char temp[n];
    strcpy(temp, s);
    for(i=0;i<n;i++)
        s[i]=temp[n-i-1];
} 

Ten program działa, ale tylko dla krótkich łańcuchów. Jestem ciekawa dlaczego i co zrobić, żeby działał dla dowolnej długości. Jeśli mam złe podejście do problemu to proszę o naprostowanie (opis dzialania w komentarzu). ;)

0

Ten program nie powinien działać. Nie alokujesz w ogóle miejsca dla łańcucha string, przez co mażesz po pamięci. Widocznie dla dłuższych łańcuchów powoduje to wywalenie się programu.

Żeby działało dla dowolnej długości, musisz zrobić tak, by łańcuch sam powiększał się w miarę dopisywania znaków. Niestety, w C nie ma takiego gotowca (jak np. string w C++), więc musisz napisać to sama.

Funkcja invert może odwracać w miejscu, zamieniając jednocześnie pierwszy i ostatni znak w ciągu, iterując do środka.

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

char *invert(char *str)
  {
   char x,*i,*e;
   for(i=str,e=i+strlen(i)-1;i<e;++i,--e) x=*i,*i=*e,*e=x;
   return str;
  }

int main(void)
  {
   char napis[100]="\n";
 
   printf("Wpisz dowolne zdanie, program je odwroci: ");
   fgets(napis,100,stdin); // masz na końcu znak \n
   napis[strlen(napis)-1]=0; // już nie
   printf("Wpisales: ");
   printf("\"%s\"\n",napis);
   printf("Po odwroceniu kolejnosci: ");
   printf("\"%s\"\n",invert(napis));

   getchar();
   return 0;
  }

1 użytkowników online, w tym zalogowanych: 0, gości: 1