2017-04-22 14 views
-1

Cコード奇妙な行動

#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. 私はそれがGCCを使用して、ちょうどそれが印刷さCtrl + zを押してコンパイル

    桁= 00000、タブ= 4200912、新しい行= 4194432、スペース= 2293540 その他=これらの数から来る2147307520

  2. 私は再びそれをコンパイルしてHELLO HELLO HELLOを入力して を入力してクリックして、それがwtnwtnwnn

    • を出力する理由(それは3つのタブをカウントする理由予想より3 nは、そこにある)ということでしょうか?
+3

を有効に警告してコンパイル: 'gccの-Wallコードを。c ' –

+2

' ndigits [i] 'をゼロに初期化しました。 「白」、「タブ」などはどうですか? – dasblinkenlight

+0

はい私は他の変数を初期化することを忘れています:) しかし、 私は再びコンパイルし、HELLO HELLO HELLOと入力して、それを入力して、wtnwtnwnnを印刷します。 なぜですか(3 nは予想よりも3つ多いです)。 –

答えて

2

caseの中には、breakがありません。あなたの望むものではありません。

また、nother,newwhite、およびtabsは初期化されていませんが、いずれにしても使用しています。この結果、未定義の動作が発生します。 (まともなコンパイラがあなたにこのについての警告を与える。)いくつかのミスがあり

+1

実際に 'case '':'は 'wtn'を出力します。 –

+0

私は上記のコードを編集しました。下部に与えられたものです。しかし、期待通りに出力します。 – Billa

+0

@Downvoter:これまたは他の回答はどのように「役に立たないのですか? – emlai

2

そうでない場合は、その初期値は予測できませんカウンタをゼロに初期化します。また、(数字をキャッチするものを除く)各caseブロックが期待される結果を達成するためにbreak;で終了する必要があります

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

これらを省略すると、次の命令が実行されます。

white++; 
break; 

...

tabs++; 
break; 

ボトムノート:あなただけのコンパイラで警告を有効にすることで、自分でこれらの間違いを発見したでしょう。それを実行すると、素朴なエラーを発見するのに多くの時間を節約できます。

1

た:

  1. あなただけの変数を宣言していなかったthem.Thus初期化ガベージ値がこれらの変数に挿入したが
  2. 上記のステートメントで改行を指定していないので、 'n'が間違って印刷されていました。
  3. あなたは印刷しませんでした。スペースの行数(それprintf (",tabs = %d , new line = %d, spaces = %d , other = %d " ,tabs ,white , new, nother) ;を確認してください)

次のコードは、あなたが必要とする出力を生成するかのように:

#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

それをチェックしてください.itはうまく動作します。 – Billa