Zeichenfolge verkehrt ausgeben



  • Hallo liebe Forum Mitglieder,

    ich habe folgende Aufgabenstellung zu lösen:

    Ich soll (max 80) Zeichen einlesen und in umgekehrter Form wieder ausgeben. Mit Enter soll die Zeicheneingabe auch schon vorher abgebrochen werden können.

    Nun es funktioniert ja schon fast: Er schreibt mir neben der umgekehrten Zeichenfolge auch noch irgendwelche anderen Zeichen hin - was ihr sehen werdet wenn ihr mein Programm testet.

    Hier der Quellcode:

    #include <stdio.h>
    #include <conio.h>
    
    #define MAX_LENGTH 80
    
    int main(void)
    {
        char ZeichenEingabe[MAX_LENGTH];
        int i,max_eing;
    
        printf("Zeichenfolge eingeben:\t");
    
        for(i=0;i<MAX_LENGTH;++i)
        {
            ZeichenEingabe[i] = getch();
    
            if(ZeichenEingabe[i] == '\r')
                break;
            else
                putchar(ZeichenEingabe[i]);
        }
         max_eing = ZeichenEingabe[i-1];
    
        printf("\n\nUmgekehrte Zeichenfolge:\n\n");
    
        for(i=max_eing;i>=0;--i)
            putchar(ZeichenEingabe[i]);
    
        getchar();
        return 0;
    }
    

    Ich verstehe nicht ganz woher er diese anderen Zeichen nimmt - denn ich gebe ja nur die Elemente von max_eing bis 0 aus, also jene Elemente in die vom Benutzer ein Zeichen geschrieben wurde oder?

    Ich erwarte natürlich keinen konkreten Lösungsvorschlag. Aber es wäre nett wenn ihr mir weiterhelfen könntet, danke.

    Gruss



  • 1. Warum nutzt du nicht einfach fgets + strlen? Das ist einfacher, schneller, eleganter - na ja - besser eben 😉
    2. getch() kennt man hier nicht! Das ist windows shit 😉
    3. Guck dir Zeile 22 mal an und überlege was du da machst.

    Edit:
    Das Ganze könnte dann so aussehen:

    int main()
    {
      char buf[81];
    
      fgets(buf, sizeof(buf), stdin);
      for (int i = strlen(buf) - 1; i >= 0; --i)
        putchar(buf[i]);
    }
    


  • Man kann es auch ganz anders machen.

    #include <stdio.h> 
    #include <string.h> 
    
    #define MAX_LENGTH 81 //an '/0' denken
    
    int main() 
    { 
        char eingabe[MAX_LENGTH]; 
        int i; 
    
        printf("Zeichenfolge eingeben: "); 
    	fgets(eingabe, MAX_LENGTH, stdin); //80 Zeichen einlesen
        printf("\n\nUmgekehrte Zeichenfolge: "); 
    
        for(i = strlen(eingabe) - 1; i >= 0; --i) // -1 wegen '/0'
            putchar(eingabe[i]); 
    }
    

    Edit: lol zu spät, ja ich habs nicht gesehen...



  • Muhaha, da war ich schneller 😉
    Aber immerhin habe ich mir doch noch schnell das "strlen() - 1" abgeguckt, total vergessen..



  • Hallo,

    danke für die schnelle Antwort!

    zu 1: Weil wir diese Funktionen noch nicht gelernt haben

    Ich habe den Fehler nun gefunden. Das Programm sieht so aus:

    #include <stdio.h>
    #include <conio.h>
    
    #define MAX_LENGTH 80
    
    int main(void)
    {
        char ZeichenEingabe[MAX_LENGTH];
        int i,max_eing=0;
    
        printf("Zeichenfolge eingeben:\t");
    
        for(i=0;i<MAX_LENGTH;++i)
        {
            ZeichenEingabe[i] = getch();
    
            if(ZeichenEingabe[i] == '\r')
            {
                max_eing = i-1;
                break;
            }
            else
            {
                putchar(ZeichenEingabe[i]);
                max_eing=i-1;
            }
        }
    
        printf("\n\nUmgekehrte Zeichenfolge:\n\n");
    
        for(i=max_eing;i>=0;--i)
            putchar(ZeichenEingabe[i]);
    
        getchar();
        return 0;
    }
    


  • Es würde auch reichen wenn ich ich max_eing nach der for-Schleife zuweise. bzw in der for-Schleife für die Ausgabe Schreibe:

    for (i=i-1;i>0;--i)
    


  • Mach das doch wenigstens so:

    char buf[81] = {0};
      int i;
    
      for (i = 0; i < sizeof(buf); ++i)
      {
        buf[i] = getchar();
        if (buf[i] == '\n')
          break;
      }
    
      for (i -= 1; i >= 0; --i)
        putchar(buf[i]);
    

    Und bitte bitte vergiss getch()! Das ist kein C!
    Vergiss die ganze conio.h 😉



  • Und bitte bitte vergiss getch()! Das ist kein C!

    Ich kann nicht einfach vergessen was uns der Lehrer beibringt :D.

    Natürlich wird er uns noch die anderen Methoden zeigen, aber wir sind grad bei Felder und nicht bei Strings.



  • Was besuchst du denn da für einen Kurs?
    Wenn das ein C Kurs sein soll geh zum Lehrer, sag ihm dass getch() kein C ist und kündige.



  • Ich besuche keinen Kurs, ich gehe in eine Hochschule für Elektronik.



  • jans94 schrieb:

    Ich besuche keinen Kurs, ich gehe in eine Hochschule für Elektronik.

    Dann geh zu deinem Lehrer und frage ihn warum ihr kein C lernt sondern irgendeinen Windows Quatsch den niemand braucht. Aber bitte in freundlichem Ton! 😉



  • Das etwas proprietär ist heißt noch lange nicht, dass es kein C ist. Wir haben das vor 10 Jahren in der Schule (11te Klasse) für C++ verwendet.



  • Ok, korrigiere, kein standard C 😉



  • tut mir leid, aber ich muss mich mal einmischen:

    seit mehreren Threads lese ich immer und immer wieder: "verwende kein getch()"...
    Doch wieso? Wenn man eine Programmiersprache erlernen, verstehen möchte, so muss
    man sie auch ausserhalb des Standards betrachten und ein grösseres Sichtfeld in
    betracht ziehen (ich weiss, übernommen aus: Star Wars - Die Rache der Sith" vom
    Kanzler Pelpetin bzw. Darth Sidious, aber der Sinn dahinter stimmt eigentlich)...

    Ok, getch() liest ohne echo direkt aus dem eingabebuffer, aber was solls...



  • itedvo schrieb:

    tut mir leid, aber ich muss mich mal einmischen:

    seit mehreren Threads lese ich immer und immer wieder: "verwende kein getch()"...
    Doch wieso? Wenn man eine Programmiersprache erlernen, verstehen möchte, so muss
    man sie auch ausserhalb des Standards betrachten und ein grösseres Sichtfeld in
    betracht ziehen (ich weiss, übernommen aus: Star Wars - Die Rache der Sith" vom
    Kanzler Pelpetin bzw. Darth Sidious, aber der Sinn dahinter stimmt eigentlich)...

    Ok, getch() liest ohne echo direkt aus dem eingabebuffer, aber was solls...

    Das Problem ist das getch() kein standard C ist. Wenn Du also explizit für Windows programmierst kannst du es nutzen. Aber dann ist man hier falsch, für getch() gibt es das DOS Forum.

    In das C Forum gehören fragen zum C Standard.



  • Seine Frage bezog sich aber nicht auf getch()

    Die conio.h ist für Einsteiger ganz brauchbar, da sie einige einfach zu verwendende Funktionen hat. Mehr aber auch nicht.



  • Kann sein, darüber will ich jetzt nicht umbedingt lange diskutieren..
    Aber in diesem Fall war sie nicht nur absolut unnötig, sondern hat das Ganze auch noch verkompliziert.



  • Du versuchst dich hier als der Uber-C-Coder darzustellen, der du aber ganz sicher nicht bist.

    Wie kann man sich an einen solchen Befehl so aufgeilen, der nicht mal Teil der Fragestellung war.
    Und dann auch noch abblocken und sagen, dass du darüber nicht diskutieren willst. 🙄

    Wenn du irgendwann selber mal eine Frage stellst, wo auch nur irgendwas enthalten ist, das nicht zum Standard gehört, dann verweise ich dich sofort in ein anderes Forum. Ganz unabhängig davon, ob das für die Fragestellung von Bedeutung ist. 🤡



  • inwiefern hab ich die sache jetzt verkompliziert? meine frage war allgemein,
    und keines wegs hatte es etwas mit dem problem zu tun. ok, vieleicht hät ich
    ja nen neuen Thread desswegen aufmachen sollen, aber tut mir leid, ist insofern
    unnötig gewesen.

    Und nur weil etwas nicht Standard C ist, heisst es noch lange nicht dass es
    "Schrott ist", was du ja indirekt (mehr direkt als indirekt) behauptet hast.

    cooky451 schrieb:

    jans94 schrieb:

    Ich besuche keinen Kurs, ich gehe in eine Hochschule für Elektronik.

    Dann geh zu deinem Lehrer und frage ihn warum ihr kein C lernt sondern irgendeinen Windows Quatsch den niemand braucht. Aber bitte in freundlichem Ton! 😉

    Und ich glaube es gibt hier keine genau Abgrenzung wann man für welche Frage in
    welches Forum geht, insofern es C und den Standard betrifft. denn ich kann ja
    mit Windows bzw. API Funktionen arbeiten und dennoch eine reine C-Standard Frage
    haben. denn ich werde keines wegs folgendes posten wenn ich ein problem hätte:

    int main(){
    
       int i;
    /*
    Kein Standard, desswegen Entfernt!
    */
    
       i++; // Wieso wird i nicht erhöht? (als beispiel frage, mir is nix besseres eingefallen ^^)
    
       return 0;
    }
    

    daher, schalt mal nen gang zurück cooky...


Log in to reply