2017-04-22 5 views
-1

C-CodeSeltsames Verhalten mit dem Zählen Leerzeichen und Tabulatoren Programm

#include <stdio.h> 

int main() 
{ 
    int c , nother , new , ndigits [10] , white, tabs ; 

    for (int i = 0 ; i< 10 ; i++) 
     ndigits[i] = 0 ; 

    while ((c = getchar())!= EOF) 
    { 
     switch (c) 
     { 
      case '0' : case '1' : case '2' : 
      case '3' : case '4' : case '5' : 
      case '6' : case '7' : case '8' : 
      case '9' : 
       ndigits[c- '0' ]++ ; 
       break ; 

      case ' ' : 
       printf("w"); /*to see how many spaces */ 
       white++ ; 

      case '\t' : 
       printf("t"); 
       tabs++; 

      case '\n' : 
       printf("n"); 
       new++ ; 
       break ; 

      default : 
       nother++ ; 
       break ;  
     } 
    } 

    printf ("digits = ") ; 

    for (int i = 0 ; i < 10 ; i++) 
     printf ("%d" , ndigits[i]) ; 

    printf (",tabs = %d , new line = %d, spaces = %d , other = %d ", 
     tabs, white , new , nother); 

    return 0 ; 
} 
  1. Wenn ich es GCC mit kompilieren und drücken Sie einfach Ctrl + z druckt

    Ziffern = 00000, Tabs = 4.200.912, neue Zeile = 4194432, Leerzeichen = 2293540 andere = 2147307520

    Woher kommen diese Zahlen?

  2. ich es wieder kompilieren und HELLO HELLO HELLO geben Sie eingeben und druckt wtnwtnwnn

    • warum ist, dass (es gibt 3 n als erwartet, warum es drei Registerkarten zählt)?
+3

Compile mit Warnungen aktiviert: 'gcc -Wall Code.c' –

+2

Sie haben 'ndigits [i] 'auf Null gesetzt. Was ist mit 'weiß',' tab', etc.? – dasblinkenlight

+0

ja ich vergesse zu anderen Variablen initialisiert :) aber Ich kompiliere es erneut und geben Sie HALLO HALLO Hallo und klicken Sie auf Enter und es druckt wtnwtnwnn warum ist das (es gibt 3 n als erwartet, warum es drei Tabs zählt)? –

Antwort

2

Einige Ihrer case s fehlen break s, die nicht zu sein scheinen, was Sie wollen.

Auch haben Sie nicht nother, new, white, initialisiert und tabs, aber sie trotzdem verwenden. Dies führt zu undefiniertem Verhalten. (Jede anständige Compiler wird Ihnen eine Warnung darüber.)

+1

In der Tat 'case '':' wird 'wtn' drucken. –

+0

Ich bearbeitet die oben genannten code.its am unteren Rand gegeben.Aber es gibt Ausgabe als ob erwartet – Billa

+0

@Downvoter: Wie ist das oder eine der anderen Antworten "nicht sinnvoll"? – emlai

2

initialisieren die Zähler sonst ihren Anfangswert auf Null wird unberechenbar.

int c , nother = 0 , new = 0 , ndigits [10] , white = 0, tabs = 0 ; 

auch jeder case Block (außer denen, die Ziffern zu fangen) müssen mit break; beendet werden, um das erwartete Ergebnis zu erzielen.

Wenn Sie sie weglassen, werden die nächsten Anweisungen ausgeführt.

white++; 
break; 

...

tabs++; 
break; 

Bottom Hinweis: Sie selbst diese Fehler nur durch Aktivieren Warnungen auf dem Compiler gefunden hätte. Tun Sie es: Sie sparen viel Zeit, um naive Fehler zu entdecken.

1

Es gab einige Fehler:

  1. Sie wurden nur die Variablen deklarieren und nicht initialisiert them.Thus ein Müll Wert in dieser Variablen eingefügt wurde
  2. Es wurde 'n' fehlerhaft gedruckt, da Sie die Unterbrechung für die obige Anweisung nicht angegeben haben.
  3. Sie druckten keine. von Räumen, als ob Anzahl von Zeilen (überprüfen Sie es printf (",tabs = %d , new line = %d, spaces = %d , other = %d " ,tabs ,white , new, nother) ;)

der folgende Code die Ausgabe, die Sie benötigen, erzeugen:

#include <stdio.h> 

    int main() 
     { 
    int c=0,nother=0,new=0,ndigits[10],white=0,tabs=0,i=0 ; 
    for (i = 0 ; i< 10 ; i++) 
     ndigits[i] = 0 ; 
    while ((c = getchar())!= EOF) 
    { 
     switch (c) 
     { 
      case '0' : 
      case '1' : 
      case '2' : 
      case '3' : 
      case '4' : 
      case '5' : 
      case '6' : 
      case '7' : 
      case '8' : 
      case '9' : 
         ndigits[c- '0' ]++ ; 
         break ; 
      case ' ' : 
         printf("w"); /*to see how many spaces */ 
         white++ ; 
      case '\t' : 
         printf("t"); 
         tabs++; 
         break; 
      case '\n' : 
          { 
         printf("n"); 
         new++ ; 
         break ; 
          } 
      default : 
         nother++ ; 
         break ;  
     } 
    } 
    printf ("digits = ") ; 
    for (i = 0 ; i < 10 ; i++) 
     printf ("%d" , ndigits[i]) ; 
    printf (",tabs = %d , new line = %d, spaces = %d , other = %d " ,tabs , new,white , nother) ; 
    return 0 ; 
     } 
+0

überprüfen Sie es. Es funktioniert gut. – Billa

Verwandte Themen