Zeichen zählen mit getchar()



  • Hallo!
    Ich habe bei folgender Aufgabe Probleme:
    Man soll mit getchar() ein Programm schreiben welches den ASCII-Code der eingegebenen Zeichen ausgibt und sobald ^z eingegeben wird soll die Anzahl der Zeichen ausgegeben werden. In der Lösung steht folgender Quelltext:

    int main (void)
    {
      int c = 0;
      int anzahl = 0;
      printf ("\n\n\n");
      c = getchar();
      if (c != EOF)
      {
            anzahl = anzahl + 1;
      } 
      printf ("Ascii-Code: %3d\n",c); 
      while (c != EOF)
      {
            c = getchar();
            printf ("Ascii-Code: %3d\n", c);
            if (c != EOF) anzahl = anzahl + 1;
      }
      printf ("Anzahl: %3d\n", anzahl);
      system("PAUSE");	
      return 0;
    }
    

    Wenn ich nun aber ein Zeichen eingebe und auf Enter drücke wird nicht nur der ASCII-Code des eingegebenen Zeichens ausgegeben sondern auch "ASCII-Code: 10".
    Wenn ich durch Eingabe von ^z die Ausgabe der Buchstabenanzahl herbeiführe wird dieses Zeichen das ich nicht eingegeben habe mit dem ASCII-Code 10 mitgezählt, wodurch eine zu hohe Zahl ausgegeben wird.
    Woher kommt das, und wie kann ich es ändern?



  • Enter, Zeilenumbruch == 10

    while (c != EOF)
      {
            c = getchar();
            if (c != EOF && c != 10)
    		{
    			printf ("Ascii-Code: %3d\n", c);
    			anzahl = anzahl + 1;
    		}
      }
    

    😉



  • Die Vorgabe "^z" lässt auf Plattform Windows schließen, hinsichtlich des Anspruches von ANSI C nicht sehr konsequent diese Aufgabenstellung deines Lehrers/Seminarleiters, aber mit system("PAUSE") hast du dies ja auch implizit umgesetzt.
    Wie schon erwähnt, musst du die Abbruchbedingung für getchar() '\n'=<Enter> von der Bearbeitung ausschließen.

    main ()
    {
      int c;
      int anzahl = 0;
      printf ("\n\n\n");
    
      while( (c=getchar()) != EOF )
        if( c!='\n' )
        {
          printf ("Ascii-Code: %3d\n", c);
          ++anzahl;
        }
    
      printf ("Anzahl: %3d\n", anzahl);
      system("PAUSE");   
      return 0;
    }
    

Anmelden zum Antworten