zeichen umdrehen

  • hi
    Ich habe mal wieder eine Frage zu meinem schlauen Buch. In dem Buch wird beschrieben das man mit dem Programm
    Zeichenfolgen umdrehen kann. Ich sollte vielleicht noch dazu sagen dass ich in Windows Programmierer. c++ (kein visual c++)




    Wenn ich das Programm ausführen erscheint der Text
    geben sie einen text ein (Ende = EOF)!
    Ich gebe also nun eine Zeichenfolge wie z.B.
    hallo
    Ein und drücke Enter
    Dann passiert leider gar nichts. Der Cursor springt in die nächste Zeile das ist aber auch schon alles.
    Ich denke dass der Fehler irgendwo
    (Ende = EOF)!
    liegt. Ich vermute das er das ja eigentlich gar nicht schreiben soll, sondern nur am Ende der Zeile eine EOF Flag
    setzen muss. Das tut er aber nicht. Weiterhin kann ich mir nicht erklären wie das Programm seinen eigentlichen Zweck erfüllen soll.
    da ja keine expliziten Angaben wie


    Code
    a=hilf
    a=b
    b=hilf


    Gemacht werden. Außerdem habe ich mich gefragt warum der Verfasser des Buches
    getchar
    putchar
    Verwendet hat und nicht

    Code
    scanf printf


    Hat das irgendeinen speziellen Grund?
    Warum wird

    Code
    zeichen


    Eigentlich als int deklarierte und nicht als char oder string?
    Und noch eine Frage hätte ich, was bedeutet eigentlich

    Code
    !=EOF


    was wird da festgelegt oder bzw. was wird dort gemacht.


    mfg

    Pc 1
    tod


    Pc 2
    Cpu 1GHz
    Betriebssystem gen2vdr 1.2
    Geforce 5200fx
    Soundkarte ultron octo-sound 7.1
    256 mbram
    TVkarte skystar 2
    LCD Samsung KS0107 / KS0108 Standard-Controller (CFAG12864B-TMI-V)

    2 Mal editiert, zuletzt von Rumkugel ()


  • Drück mal nach dem Enter "STRG+D", das sendet das EOF.


    Zitat


    Weiterhin kann ich mir nicht erklären wie das Programm seinen eigentlichen Zweck erfüllen soll.


    Rekursion heist das Zauberwort. ;)

  • Schönes Beispiel :-))


    Übrigens liest es sich besser, wenn Du [ code ] Tags verwendest.


    Zitat

    Original von Rumkugel
    Ich gebe also nun eine Zeichenfolge wie z.B.
    hallo
    Ein und drücke Enter
    Dann passiert leider gar nichts. Der Cursor springt in die nächste Zeile das ist aber auch schon alles.


    Mit EOF ist End-of-File gemeint, vermutlich die Tastenkombination Ctrl-Z.


    Zitat

    Original von Rumkugel
    Weiterhin kann ich mir nicht erklären wie das Programm seinen eigentlichen Zweck erfüllen soll.


    Es wird umdrehen() rekursiv aufgerufen, also für jedes Zeichen wir umdrehen() in umdrehen() noch mal aufgerufen und am Ende hangelt er sich wieder zurück.



    Er will nur einzelne Zeichen holen/ausgegeben, nicht gleich ganz Strings. und get/putchar sind als (int) deklariert, deshalb muss (sollte) man das auch so übernehmen.


    Zitat

    Original von Rumkugel
    Und noch eine Frage hätte ich, was bedeutet eigentlich
    !=EOF
    was wird da festgelegt oder bzw. was wird dort gemacht.


    != bedeutete ungleich, EOF siehe oben

  • Danke für die Antworten


    Ich hab das oben mal geänderte


    Ich habe jetzt
    Strg+Z
    Strg+Y
    Strg+D
    Eingegeben. Doch leider funktioniert nichts. Kann man das EOF noch irgendwie anders aufrufen bzw. senden.


    Dieser Code steht unter Rekursive Funktionen. Der Autor beschreibt es so.
    "Funktionen können auch Rekursive aufgerufen werden, d.h. eine Funktion darf sich selbst wieder aufrufen."
    Das könnte man Ja mit einer Schleife vergleichen, nur dass bei der Rekursiven Funktion die zuletzt aufgerufene Funktion
    als erstes übergeben wird. Sehe ich das Richtige?
    Mir ist da noch etwas im Code aufgefallen. Muss das putchar nicht außerhalb der ifschleife sein. Also so



    Sonst würde er Ja meines verständnises das Zeichen immer gleich hinschreiben, bzw. bei Erreichen


    Code
    zeichen = EOF


    Nichts ausgeben. Da die ifschleife ja verlassen wird.

    Pc 1
    tod


    Pc 2
    Cpu 1GHz
    Betriebssystem gen2vdr 1.2
    Geforce 5200fx
    Soundkarte ultron octo-sound 7.1
    256 mbram
    TVkarte skystar 2
    LCD Samsung KS0107 / KS0108 Standard-Controller (CFAG12864B-TMI-V)


  • Nach Eingabe des Textes man Enter drücken und zusätzlich solange Strg+D drücken bis sich das Programm beendet.



    Zitat


    Mir ist da noch etwas im Code aufgefallen. Muss das putchar nicht außerhalb der ifschleife sein.


    Wozu? Das würde nur ganz am Ende noch versuchen das EOF auszuprinten.

  • danke habs jetz hinbekommen mit
    Strg+z (bin ja unter windows)
    man muß nur ziemlich schnell und exakt sein.


    Edit:
    habs mal so


    und mal so



    funst beides

    Pc 1
    tod


    Pc 2
    Cpu 1GHz
    Betriebssystem gen2vdr 1.2
    Geforce 5200fx
    Soundkarte ultron octo-sound 7.1
    256 mbram
    TVkarte skystar 2
    LCD Samsung KS0107 / KS0108 Standard-Controller (CFAG12864B-TMI-V)

    2 Mal editiert, zuletzt von Rumkugel ()

  • Die erste Lösung unterscheidet sich von der zweiten auch nur darin, dass das EOF-"Zeichen" mit ausgegeben wird. Das dürfte aber irgendein nicht druckbares Zeichen sein, weshalb Du es nicht siehst.


    Vielleciht noch ein paar Hinweise am Rande: Arbeite an Deiner Einrückung! Die Leerzeichen vor den Ausdrücken macht man nicht zum Spass und vor allem nicht zufällig (:D) , sondern richtet sie an den Blöcken aus. Neuer Block ({) - weiter einrücken. Block zuende (}) - EInrückung aufheben.


    Speziell, wenn Du irgendwann mit etwas komplexeren Codes Fragen in Foren stellst, werden Dir mehr Leute helfen, wenn Sie den Code leicht lesen können. Dasselbe gilt für Dich selbst, Du kannst den Code später auch besser lesen, wenn Du jetzt schon darauf achtest.


    Und noch ein paar Nebensächlichkeiten:
    cstdlib ist ein C++-Header, stdio.h ist ein C-Header. Nimm besser entweder cstdlib und cstdio (C++) oder stdlib.h und stdio.h (C).


    iostream brauchst Du in Deinem Programm nirgends.


    "(void)" (mit Klammern) hinter Funktionsköpfen ist in C++ veraltet. Wenn Du etwas weniger tippen willst, schreib einfach "()". In C haben "()" und "(void)" noch unterschiedliche Bedeutungen.

  • Danke für die Anregungen
    Ich bin für alles offen was mir später einmal das Leben erleichtert.


    (leider ist es im Moment so dass ich ziemlich oft sehr deprimiert vor der Kiste sitze :computertod,
    da war mir das dann auch schon wurst. Ich fummle ziemlich stark in den Codes herum,
    wenn ich etwas nicht verstehe oder ich etwas ausprobieren will.
    Ich werde aber versuchen mich zu bessern. :idee)


    mfg

    Pc 1
    tod


    Pc 2
    Cpu 1GHz
    Betriebssystem gen2vdr 1.2
    Geforce 5200fx
    Soundkarte ultron octo-sound 7.1
    256 mbram
    TVkarte skystar 2
    LCD Samsung KS0107 / KS0108 Standard-Controller (CFAG12864B-TMI-V)

    Einmal editiert, zuletzt von Rumkugel ()

  • Das EOF, das hier zurück gegeben wird, ist tatsächlich kein Zeichen. getchar() liefert entweder ein Byte als 0..255 zurück, oder EOF als Fehlercode für das Dateiende, wobei EOF üblicherweise als -1 deklariert ist.


    Ein putchar(EOF) wird vermutlich ein zusätzliches ASCII-Zeichen 255 ausgeben, bzw. was auf der jeweiligen Plattform gerade (unsigned char)EOF ist.


    Gruß,


    Udo

  • EOF ist imho auch nicht die beste Abbruchbedinung...
    eine Abfrage auf return wäre wohl etwas besser.
    Bin jetzt auch nicht mehr ganz fit... aber als int dürfte es der ASCII Wert 13 sein oder halt '\n' oder ähnlich.
    Man könnte auch einfach die erhaltenen int Werte kurz ausgeben...
    Ist jedenfalls besser als sich einen mit dem EOF abzubrechen.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!