Wort verdrehen?



  • Hallo
    ich habe etwas ziemlich primitives zu programmieren und irgendwie klappt es einfach nicht.
    Der eingegeben String soll in diesem Programm einfach von hinten nach vorne im gleichen String gespeichert werden. Jedoch funktioniert das nicht so recht =(.
    Ich hoffe ihr könnt mir weiterhelfen 😕 😕 😕

    int main()
    {
        char s[]="hallo";
        int i=0;
        int anzahl=0;
        char tmp;
    
        while(s[i] != '\0')           /* Zählt die Anzahl der Buchstaben*/
        {
            anzahl++;
            i++;
        }
    
        for(i=0; i < anzahl; i++)     /* verdreht das wort*/
        {
            tmp = s[i];
            s[anzahl -i]= tmp;
    
        }
        s[i] = '\0';
    
        printf("%s", s);
    
        return 0;
    }
    


  • Mal nebenbei zur Anregung, wenn man sowas macht sollte man sich fragen ob man es mit einem einzigen Array lösen kann.
    Denn selbst wenn das was du machst korrekt wäre hättest du das Problem du überschreibst daten die du noch brauchst



  • ja das ist das problem ich muss es mit einem einzigen array lösen.
    hab auch schon daran gedacht:

    tmp = s[i];
    s[i] = s[anzahl - i];
    s[anzahl - i} = tmp;
    

    das alles funktioniert nicht so wie ich das möchte..´obwohl das doch nicht so schwer sein kann.



  • int main(int argc, char *argv[])
    {
      char s[]="HELLO WORLD";
      char str[1000];
      int anz=0;
    
      while(s[anz])
        anz++;
    
      int i,j;
      for(i=anz-1,j=0;i>=0;i--,j++)
        str[j]=s[i];
    
      strcpy(s,str);
      printf("%s",str);
    
      return 0;
    }
    


  • #include <stdio.h>
    
    int main()
    {
    	char s[] = "hallo";
    
    	char *beg = s;
    	char *end = beg + strlen(s) - 1;
    
    	char tmp;
    
    	while(end > beg)
    	{
    		tmp = *beg;
    		*beg++ = *end;
    		*end-- = tmp;
    	}
    
    	printf("%s", s);
    }
    


  • danke dir vielmals. das problem welches ich habe ist, dass ich wirklich nur einen string verwenden darf. 😞



  • Mein Vorschlag benutzt nur ein Array.



  • yeah super danke !

    kann vielleicht einmal erläuert werden warum das nicht funktioniert ?

    for(i=0; i < anzahl; i++)
    {
        tmp = s[anzahl - i];
        s[i] = tmp;
    }
    

    ich mein ich speichere jedes einzelne zeichen in tmp und übergebe es dann an der richtigen stelle dem s[i], komm nicht ganz drauf wieso das so nicht funktionieren kann.



  • Du musst nach der Hälfte aufhören, sonst vertauschst Du zweimal und bist wieder beim Anfangszustand:

    #include <stdio.h>
    
    int main()
    {
    	char s[] = "hallo Welt";
    
    	int anz = strlen(s);
    	int i;
    	char tmp;
    
    	for(i = 0; i < anz / 2; ++i)
    	{
    		tmp = s[anz - 1 - i];
    		s[anz - 1 - i] = s[i];
    		s[i] = tmp;
    	}
    
    	printf("%s", s);
    }
    


  • Nimm doch einfach als String: OTTO, dann funz't... 😉 Das Problem ist, was Du auch machst, Du überschreibst immer Daten im Array, die Du noch brauchst. Wer sagt, daß Du das in einem Array erledigen mußt?



  • weil du den string s mit neuen Zeichen überschreibst

    Beispiel:
    anzahl=5; i=1
    dann wäre s[anzahl-i]=s[5-1]=s[4] und s[i]=s[1]
    und s[1]=s[4]
    in einem späteren Schleifendurchgang (i=4)
    s[5-4]=s[1] und s[i]=s[4]
    und s[1] muss auf s[4] übertragen werden, aber s[1]=s[4] -> Problem

    (Besser kann ich es leider nicht erklären, ich hoffe es trotzdem einigermaßen verständlich)



  • Wie wäre es, wenn du nur bis zur Hälfte tauscht, dann überschreibst du die Zeichen nicht wieder.

    for(i=0; i < anzahl/2; i++)
    {
        tmp = s[anzahl - i];
        s[i] = tmp;
    }
    


  • DirkB schrieb:

    Wie wäre es, wenn du nur bis zur Hälfte tauscht, dann überschreibst du die Zeichen nicht wieder.

    Super Idee.



  • Dave01 schrieb:

    kann vielleicht einmal erläuert werden warum das nicht funktioniert ?

    Versuche es doch einfach mal zu debuggen. Dann siehst du den Fehler schnell. 🙂

    Was haltet ihr von meiner Variante?

    void TwistStr(char* str)
    {
      char buf = '\0';
      int strLen = 0;
    
      while (str[strLen])
    	  strLen++;
      strLen--;
    
      for(int i = 0; i <= (strLen / 2); i++)
      {
        buf = str[i];
        str[i] = str[strLen - i];
        str[strLen - i] = buf;
      }
    }
    


  • ajaa stimmt. danke =). Mein Prüfer sagte das. Hatte ne Prüfung und hab mächtig Punkte abgezogen bekommen. Die Angabe war keine string.h verwenden und der string sollte in dem selben array wieder gespeichert werden. So nebenbei hab ich ihn gefragt ob strlen beziehungsweise strrev erlaubt sind..
    Er sagte natürlich nein bzgl. string.h. jetzt probiere ich das gerade nur mit stdlib.h und stdio.h und es FUNKTIONIERT! Weiss vielleicht jemand warum? Könnte ich mir vielleicht noch Punkte rausholen?



  • Wenn Du strlen selbst programmierst, wie in Deinem Eingangspost, oder so wie Freeze in seinem Beispiel, dann brauchst Du ja als Standardfunktion nur printf, und die ist zB in stdio.h deklariert.
    Mehr benötigst Du dann nicht.



  • lass mich zusammenfassen: du darfst keine standard string funktionen verwenden,
    nur ein array verwenden (wobei die frage ist: sind zwei- oder mehrdimensionale
    arrays ausgeschlossen?) und es wurden schon einige lösungen präsentiert... einzig
    was dir noch fehlt ist eine abgeschleckte, mit maschen verzierte 1er Kandidat
    Lösung 😃

    nun ja, wenn du aus sämtlichen bereits geposteten Lösungen die Ideallösung
    zusammen schneiderst, was jetzt wohl kein problem mehr sein sollte, sollte es
    ne 1 werden, ausser du merkst dir den Sinn und die Logik dahinter nicht.



  • Belli schrieb:

    #include <stdio.h>
    
    int main()
    {
    	char s[] = "hallo";
    	
    	char *beg = s;
    	char *end = beg + strlen(s) - 1;
    	
    	char tmp;
    	
    	while(end > beg)
    	{
    		tmp = *beg;
    		*beg++ = *end;
    		*end-- = tmp;
    	}
    	
    	printf("%s", s);
    }
    

    Das finde ich, ist die beste Lösung; dann hättest Du eine 1 bekommen...sofern Du strlen() durch eine eigene Funktion, die Du ja geleistest hast, ersetzt hättest. An diesem Beispiel sieht man, wie man etwas sehr elegant durch Zeiger lösen kann. Wer sagt da noch, daß Zeiger "obsolete" sind 😉



  • @ itedvo Nein nein hab schon verstanden warums bei mir nicht gefunkt hatte (wurde ja immer überschrieben) und genau dieses Exemplar hatte ich am Papier bei der Prüfung geschrieben und ich hatte ihn gefragt ob man strrev/strlen verwenden darf..nein sagte er weil es ja in der string.h drinnen ist... bei mir funkt. die Funktionen aber auch ohne dieser Libary. Aber ist egal danke an alle für die schnellen Antworten !!!

    Liebe Grüße



  • Dave01 schrieb:

    ..nein sagte er weil es ja in der string.h drinnen ist... bei mir funkt. die Funktionen aber auch ohne dieser Libary.

    Welchen Compiler nutzt Du? Weil diese Funktionen normalerweise in "string.h" definiert sind...


Anmelden zum Antworten