Array Wert wird gezählt obwohl mit 0 ausgelesen, wo er halt nicht gezählt sein sollte.



  • Hallo Leute,

    es geht mir bei diesem Beispiel um die Zeilen 28 und 42. Wenn die Werte von stdbin eingelesen werden dann werden bei einem EOF durch Str-D die Inhalte des Array korrekt ausgegeben. Ausser ich gebe vor Str-D noch ein Enter dazu, also ein '\n'.
    Jetzt wird ein weiterer Wert aus dem Array ausgegeben der 0 ist, was völlig richtig ist, aber darum auch nicht ausgegeben werden sollte, weil ich in den Zeilen 41 bis 43 nur Array Inhalte zähle die größer als 0 sind.

    Also ich zähle Worte:
    asdf asdf asdf[EOF]
    Wort 1: 4
    Wort 2: 4
    Wort 3: 4

    Ich zähle noch mal Worte:
    asdf asdf asdf[Enter]
    [EOF]
    Wort 1: 4
    Wort 2: 4
    Wort 3: 4
    Word 4: 0

    Warum??

    1 /* gb_word_count.c */
        2
        3 #include <stdio.h>
        4
        5 #define STELLEN 100
        6
        7 /* count lines, words and characters in input */
        8
    >>  9 main() {
       10     int done, c, cc, cw, ct, i, k, ih, gl, nz; /* c: char, cc: countchar, cw: countword, ct: counttest, ih: inha      lte
       11                                   * gl: größte länge, nz: nachzähler
       12                                   */
       13     int wortarray[STELLEN];
       14
       15     done = nz = ct = gl = ih = k = i = cw = cc = 0;
       16
       17    for (i = 0; i < STELLEN; ++i)
       18            wortarray[i] = 0;
       19
       20     while(done != 1){
       21         c = getchar();
       22
       23         if (c != '\n' || c != '\t' || c != ' ' || c != EOF) {
       24                 ++cc;
       25                 ++ct;
       26         }
       27         if (c == ' ' || c == EOF || c == '\n' || c == '\t'){
       28                 ++cw;
       29                 ct = 0;
       30         }
       31         if ( cc > 0 && ct == 0) {
       32                 wortarray[cw] = cc;
       33                 cc = 0;
       34         }
       35
       36         if (c == EOF ) {
       37             done = 1;
       38         }
       39     }
       40
       41     for (i = 0; i <= STELLEN; ++i)
       42         if (wortarray[i] > 0)
       43                 ++ih;
       44
       45
       46     printf("\nZellen belegt im Array: %d\n", ih);
       47     printf("\n");
       48     printf("Wort Nr|Wort Länge\n");
       49     for (i = 1; i <= ih; ++i)
       50             printf("Wort %d:  %d\n", i, wortarray[i] - 1);
       51
       52     for (i = 1; i <= ih; ++i)
       53             if (wortarray[i] > gl)
       54                     gl = wortarray[i];
       55     printf("\n");
       56
       57     printf("Das längste Wort hat %d Buchstaben.\n", gl - 1);
       58
       59
       60 }
       61
    

  • Mod

    - Bitte ohne Zeilennummern im Code posten.

    23         if (c != '\n' || c != '\t' || c != ' ' || c != EOF) {
       24                 ++cc;
       25                 ++ct;
       26         }
       27         if (c == ' ' || c == EOF || c == '\n' || c == '\t'){
       28                 ++cw;
       29                 ct = 0;
       30         }
    

    Die erste Bedingung ist Unfug, weil immer wahr.
    - Bezeichner, die etwas bedeuten, könnten mich dazu bringen, den Code genauer anzuschauen. Ich habe nichts gegen ein einzelne Variable, die c heisst - wenn aber alles cryptisch ist, möchte ich mir das nicht antun. Und nein, es reicht nicht, irgenwo weiter oben in einem Kommentar mal was dazu geschrieben zu haben. Heutige Compiler sind auch durchaus in der Lage, Namen, die länger als 2 Buchstaben sind, zu unterscheiden.



  • Kritik ist angekommen.



  • Ohne mir das alles im Detail durchgelesen zu haben:
    Du hast AND und OR nie verstanden.



  • Mit der Zählerei ab Zeile 41 ist auch etwas faul.
    wortarray[STELLEN] geht nicht bis STELLEN sondern bis STELLEN-1, zero based.
    --> also

    for (i = 0; i < STELLEN; i++)
    

    < und nicht <=

    Btw, deine ständigen Pre-Increments wirken auch komisch.

    Fazit: Alles einstampfen und neu machen! 😉



  • Hier jetzt mal in besser.

    EOP: Könntest du das mit 2 oder 3 Worten beschreiben. Dann will ich auch wohl googeln.

    /* gb_word_count.c */
    
      #include <stdio.h>
    
      #define STELLEN 100
    
      /* count lines, words in input */
    
    >>main() {
    
          int anzahlBuchstaben = 0;
          int testZaehler = 0;
          int anzahlWoerter = 0;
          int mitWert = 0;
          int laengeMax = 0;
          int amEnde = 0;
          int i = 0;
          int c = 0;
    
          int wortarray[STELLEN];
    
         for (i = 0; i < STELLEN; ++i)
                 wortarray[i] = 0;
    
          while(amEnde != 1){
              c = getchar();
    
              if (c != '\n' || c != '\t' || c != ' ' || c != EOF) {
                      ++anzahlBuchstaben;
                      ++testZaehler;
              }
              if (c == ' ' || c == EOF || c == '\n' || c == '\t'){
                      ++anzahlWoerter;
                      testZaehler = 0;
              }
              if ( anzahlBuchstaben > 0 && testZaehler == 0) {
                      wortarray[anzahlWoerter] = anzahlBuchstaben;
                      anzahlBuchstaben = 0;
              }
    
              if (c == EOF ) {
                  amEnde = 1;
              }
          }
    
          for (i = 0; i <= STELLEN; ++i)
              if (wortarray[i] > 0)
                      ++mitWert;
    
          printf("\nZellen belegt im Array: %d\n", mitWert);
          printf("\n");
          printf("Wort Nr|Wort Länge\n");
          for (i = 1; i <= mitWert; ++i)
                  printf("Wort %d:  %d\n", i, wortarray[i] - 1);
    
          for (i = 1; i <= mitWert; ++i)
                  if (wortarray[i] > laengeMax)
                          laengeMax = wortarray[i];
          printf("\n");
    
          printf("Das längste Wort hat %d Buchstaben.\n", laengeMax - 1);
    
      }
    


  • Fricky667;
    Ja, das macht Sinn. 🙂

    Und Einstampfen mag ich nicht, erst will ich wissen warum das nicht klappt. Allerdings bin ich jetzt gerade zum Grillen eingeladen worden, muß darum wohl los.

    Wünschen noch allen ein schönes WE und vielleicht komme ich ja noch drauf.



  • gutschy schrieb:

    Und Einstampfen mag ich nicht, erst will ich wissen warum das nicht klappt.

    Geh doch im Singlestep mit dem Debugger durch und achte bei jeder Anweisung darauf was passiert. Für einen Einsteiger dürfte das recht erleuchtend sein.



  • gutschy schrieb:

    EOP: Könntest du das mit 2 oder 3 Worten beschreiben. Dann will ich auch wohl googeln.

    Hat camper doch schon alles gesagt. Wie du AND und OR sinnvoll benutzt kann dir wohl kaum einer in 2 oder 3 Worten beschreiben.

    EDIT:
    Es ist ein Denkfehler zu glauben, dass ein ODER alles ausschließt (bzw. einschließt) was danach kommt.
    Sobald die erste Bedingung erfüllt ist ist Ende.


Anmelden zum Antworten