String einlesen und rückwärts wieder ausgeben



  • Hi Leutz.

    Ich hatte ma bock so eine funktion zu schreiben und habs auch geschafft.
    Nun meine Frage: "Kann man das auch anders lösen?"

    #include <stdio.h>
    #include <string.h>
    void funktion(char *fkt_string,char *reversed)
    {
    int i;
    int laenge;
    
    laenge=0;
    i=0;
    laenge=strlen(fkt_string);
    printf("Laenge des Strings in der Funktion:\t%d\n", strlen(fkt_string));
    
    do
    {
        reversed[i] = fkt_string[laenge-1];
        laenge--;
        i++;
        if (laenge==0)
            reversed[i]='\0';
    }while (laenge>0);
    
    printf("Umgedrehter String in Funktion:\t\t%s\n", reversed);
    }
    
    void main()
    {
    char string[500];
    char reversed[500];
    printf("Bitte geben Sie einen String ein: ");
    gets(string);
    fflush(stdin);
    
    funktion(string,reversed);
    printf("Umgedrehter String im Hauptprogramm:\t%s\n", reversed);
    printf("Laenge des Strings im Hauptprogramm:\t%d\n", strlen(string));
    }
    

    [ Dieser Beitrag wurde am 15.12.2002 um 19:16 Uhr von Peter Piksa editiert. ]



  • hmmm mit strrev?

    -junix



  • Mit Zeigern:

    void reverse(char *src, char *dst) {
       dst += strlen(src);
       *dst = 0;
       while( *src )
          *(--dst) = *src++;
    }
    

    junix: strrev gibts nicht 😃



  • Original erstellt von Peter Piksa:
    **Hi Leutz.

    Ich hatte ma bock so eine funktion zu schreiben und habs auch geschafft.
    Nun meine Frage: "Kann man das auch anders lösen?"
    ...**

    Sicher ... es gibt immer einen anderen Weg. Nachdem die gleiche Information am Bildschirm dargestellt werden soll (nur eben anders rum), kann man den String auch gleich rückwerts wieder ausgeben:

    #include <stdio.h>
    #include <string.h>
    
    int main(void)
    {
        int i;
        char string[500];
    
        printf("Bitte geben Sie einen String ein: "); 
    
        for (i = strlen(gets(string)); i > 0; --i)
            putchar(string[i-1]);
    
        return 0;
    }
    


  • @Peter Piksa: Noch was.
    1. void main(...) ist böse!
    2. fflush(stdin) ist noch böser!
    3. gets(...) ist _eigentlich_ am bösten... Aber für einfache Progs geht's schon. In umfangreicheren Geschichten, insbesondere wenn Leute mit dem Programm arbeiten sollen, muss man fgets() nehmen.



  • Original erstellt von mady:
    @Peter Piksa: Noch was.
    1. void main(...) ist böse!
    2. fflush(stdin) ist noch böser!
    3. gets(...) ist _eigentlich_ am bösten... Aber für einfache Progs geht's schon. In umfangreicheren Geschichten, insbesondere wenn Leute mit dem Programm arbeiten sollen, muss man fgets() nehmen.

    Also ich mache C-Programmierung in der Schule. Ist eigentlich auch mein Berufswunsch sowas mal zu machen. Was ich gar nicht verstehe ist wieso ihr fortgeschrittenen Programmierer euch immer so über void main(), fflush(stdin), und solche geschichten aufregt?! Kannst du mir das mal erklären, mady?



  • Original erstellt von DrGreenthumb:
    **Mit Zeigern:

    void reverse(char *src, char *dst) {
       dst += strlen(src);
       *dst = 0;
       while( *src )
          *(--dst) = *src++;
    }
    

    junix: strrev gibts nicht :D**

    öhh das programm raff ich nicht...was passiert da?

    du schreibst eine funktion ohne rückgabewert und verwendest zwei char Pointer.
    dann machste destination = (destination + strlen(source))
    dann setzt du den zeigerinhalt von destination auf "0" - Warum ?(
    ab dann raff ich nüx mehr



  • Original erstellt von Peter Piksa:
    Also ich mache C-Programmierung in der Schule. Ist eigentlich auch mein Berufswunsch sowas mal zu machen. Was ich gar nicht verstehe ist wieso ihr fortgeschrittenen Programmierer euch immer so über void main(), fflush(stdin), und solche geschichten aufregt?! Kannst du mir das mal erklären, mady?

    Du willst also Lernen, mit C (oder einer anderen Programmiersprache) Programme zu schreiben? Dann solltest Du's von Anfang an gleich richtig lernen! Dazu gehört eben auch, dass ich den Standard meiner Sprache kenne und mich daran halte.



  • könnte man auch rekursiv lösen

    mfg



  • Original erstellt von mady:
    Du willst also Lernen, mit C (oder einer anderen Programmiersprache) Programme zu schreiben? Dann solltest Du's von Anfang an gleich richtig lernen! Dazu gehört eben auch, dass ich den Standard meiner Sprache kenne und mich daran halte.

    Ja...geile antwort. 😃



  • @Peter: Ich hab' den Standard ja nicht gemacht .... aber ich halte mich dran. Und wenn's in diesem Forum nunmal um ANSI-C geht ... naja ... :))

    Dass das C in der Schule ein etwas anderes C ist, ist jedem klar. Ich pers. hab' mich mit meinen Lehrern schon rumgestritten (und verloren!), weil sie nicht einsehen wollten, dass 'if (x) a();' das gleiche bedeutet wie 'if (x) { a(); }.'



  • Minsch, mady, ich wollte doch nur eine Antwort haben auf meine Frage warum man das nicht verwenden soll! Warum gibbet diese funktionen void main(), und fflush überhaupt wenn man die nich verwenden soll?!



  • void main gibt es nicht und hat es nie gegeben. Das ist eine Erfindung von faulen Tutorial Schreibern!

    main hat die signatur

    int main(void)
    oder
    int main(int, char**)

    alles andere ist implementation defined und wenn ich nicht irre vor C99 sogar undefined!

    fflush ist nur für ausgabe ströme definiert - ist ja auch logisch: flushen des buffers heisst, den buffer wo hin schreiben undnicht ihn einfach loeschen!!

    ein blick in die FAQ tut dir sicher nicht weh!!



  • Man du Shade, du redest schon wie mein alter ProggenLehrer "goto gibt es nicht" loool - einfach irre geil der mann 😃 😃 😃

    Was ich nicht verstehe: ihr sagt immer blah blah gibt es nicht sülz, aber habt keine Begründung 🙂



  • @Peter: void main(...) kann's nicht geben, weil einige Betriebssysteme den Return-Wert eines Programms auswerten. Lieferst Du void zurück an Dein OS, dann kommt's auf Deinen Compiler an, ob er das zulässt bzw. welcher Maschinen-Code erzeugt wird. Das ganze ist dann also von einer bestimmten Umgebung abhängig.

    Das widerspricht der Philosophie der Programmiersprache C.

    lt. C weiß der Programmierer, was er tut. Dein Compiler kann diesen Code akzeptieren - Dein Programm stützt dann in einer anderen Umgebung aber vielleicht aus irgend einem Grund ab. Viel Spaß beim Finden solcher Fehler...

    EDIT: Hier noch ein kurzer Text über den Sinn von Standards: http://www.ifi.unizh.ch/~riedl/lectures/standard.html

    [ Dieser Beitrag wurde am 16.12.2002 um 18:19 Uhr von mady editiert. ]



  • Wenn festgelegt werden würde, das void main() immer EXIT_SUCCES zurückliefern würde, dann wüsste das der C-Programmierer und es gäbe kein Problem. Von daher ist das Argument irgendwie nichts.
    Wie war das mit int main() ohne return? Das soll ja korrekt sein, oder?

    Wenn jemand gerade Programmieren lernt sollte die Syntax und so'n firlefanz wie void main unwichtig sein... Ist natürlich trotzdem gut zu wissen das es eigentlich falsch ist.

    Peter: Hast du Zeiger verstanden? Sonst machts nicht viel Sinn meinen Code weiter zu erklären.

    [ Dieser Beitrag wurde am 16.12.2002 um 18:24 Uhr von DrGreenthumb editiert. ]



  • Original erstellt von Peter Piksa:
    ihr sagt immer blah blah gibt es nicht sülz, aber habt keine Begründung

    Nicht wir haben das? Haben doch wir! Lesen müssen Du: Tut mit sein Sprache wie! Halten Du dich müssen ahn Grammaig unt Schreibrächtung! Verstehen niemadn tut dich sonzt! C in das so genau ist! Versteht nur das der Compiler er kennt was! Compiler hier unt nix kennt void main() weil nix des Teil von Sprache! Unt nur sprechen Compiler Sprache eine eindeutige! Er nix was weiß Du meinst sonzt! Darum exakt sein Du müssen unt halten dich ahn tie Regeln wo Compiler auch kennen!

    NCRS!



  • meine rekursive lösung:

    #include <stdio.h>
    
    void print_reverse(char *ptr);
    
    int main()
    {
        char str[]="Hello";
    
        print_reverse(str);
    }
    
    void print_reverse(char *ptr)
    {
        if(*ptr != '\0') 
            print_reverse(ptr+1);
    
        printf("%c",*ptr);
    }
    

    die funktion wird solange neu aufgerufen (zeiger jedesmal um 1 weiterschieben) und damit der alte wert der variable auf dem stack(stapel) abgelegt, bis sie das ende des strings erreicht hat, dann fängt das rückspringen und ausgeben in umgekehrter reihenfolge an...die werte werden (beim letzten,also ganz oben, wird begonnen) wieder vom stack heruntergenommen bis wieder main erreicht ist, hoffe das war halbwegs verständlich....

    mfg



  • Original erstellt von Peter Piksa:
    **Man du Shade, du redest schon wie mein alter ProggenLehrer "goto gibt es nicht" loool - einfach irre geil der mann 😃 😃 😃

    Was ich nicht verstehe: ihr sagt immer blah blah gibt es nicht sülz, aber habt keine Begründung =)**

    goto gibt es sehr wohl.
    Schau mal: wenn du deutsch sprechen willst hältst du dich an den Duden, und wenn du C programmieren willst, dann hältst du dich an den Sprachstandard!

    Du würdest mich auch nicht verstehen wenn ich zu dir:
    wos wüst oida?
    sage! es sei denn du bist zufällig wiener :p

    ne, mal im ernst: es gibt regeln an die man sich halten muss, und zu denen gehört dass fflush nur für einen ausgabestrom definiert ist und main den return type int haben muss. siehe FAQ da habe ich die entsprechenden passagen aus dem standard hingeschrieben!



  • Und noch ne Variante der Vollständigkeit halber:
    (sollte auch etwas leichter nachzuvollziehen sein)

    for(i=(strlen(src)-1), j = 0; i >= 0 ; i--, j++)
       dst[j] = src[i];
    

Anmelden zum Antworten