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...


Log in to reply