2016-12-01 10 views
0

私は、どの文字をどれだけ表示するか、ユーザーが選択した文にどれくらい表示するかを試みています。したがって、ユーザーが「Hello World!」を入力するとプログラムは1つのcharとそれが使用された回数を返すべきです。配列内の各文字の数をカウントします。

" SPACE:1, !:1, H:1, W:1, e:1, d:1, l:3, o:2, r:1,"

私は、ユーザーがから選択することができ、他の選択肢を持っているので、私はスイッチでそれを持っています。

今はどの文字が使用されているのか、SPACEからQまでの数はどれくらいあるのかを知ることができます。小文字もすべて手に入れることができますが、 'a'を読むと1 ' a 'と1つのスペース(ASCIIコードでは32から始まり、小文字が上がるにつれて上がります)。

これらは私が使用する変数です。

int menyval = 0, i, k = 0, h, j, count, count2; 
char input, str[100], getridof, add, character; 

これは私がこの場合持っているものです。

printf("Write a string not more then 50 chars:\n"); 
     getchar(); 
     i = 0; 
     j = 0; 
     count = 0; 
     int counts[50] = { 0 }; 
     gets(str); 
     str[j] = str[i]; 
      while (str[i] != '\0') { 


       if (str[i] >= 97 && str[i] <= 122) { 
        counts[str[i] - 97]++; 
       } 
       i++; 
       count++; 
      } 

      for (i = 0; i < 50; i++) { 
       if (counts[i] != 0) { 
        printf("%c: %d\n", i + 97, counts[i]); 
       } 
      } 

      while (str[j] != '\0') { 


       if (((str[j] >= 32 && str[j] <=96)) || ((str[j] >=123 && str[j] <= 126))) { 
        counts[str[j] - 32]++; 
       } 
       j++; 
      } 

      for (j = 0; j < 50; j++) { 
       if (counts[j] != 0) { 
        //if((j) < 127) 
        printf("%c: %d\n", j + 32, counts[j]); 
       } 
      } 
     printf("Total amount of char: %d\n", count); 
     str[i] = '\0'; 
     system("pause"); 
     system("cls"); 

これは学校の割り当てなので、あなたが直接コードを言いたくないが、いくつかのヒントが正しい方向に私を指すようにするために、私は非常にthankfullだろう場合、私は理解しています。

+1

'gets()'を使わないでください.http://stackoverflow.com/questions/1694036/why-is-the-gets-function-so-dangerous-that-it-should-not-be-used – MrMuMu

+0

あなたの 'counts'配列は' j'でループに格納しようとしている値の数を保持するのに十分な大きさではありません。配列には '50 'の整数スロットしかありませんが、それをはるかに越えてインデックスしています(' 96-32 = 64')。また、印刷してからもう一度それを使用しようとする間に配列をゼロに戻していません。私はあなたが実際にそれをしたいと思います。 – eddiem

+0

マップを使用してクリーナーの実装を行うことができます。マップのドキュメントを確認してください。 – Ehsan

答えて

1

ACIIテーブル:http://www.asciitable.com/

char str[12] = "hello world"; 

    // initialize an array of each possible character 
    int charCount[128]; 
    memset(charCount, 0, sizeof(charCount)); 

    // iterate through the array of characters 
    // incrementing the index in charCount matching the element in str 
    char* currChar = str; 
    while(*currChar) 
      ++charCount[*(currChar++)]; 

    // iterate through the array once more 
    for(int i = 0; i < 128; ++i) { 
      // if the character was found in the string, 
      // print it and its count 
      if(charCount[i]) { 
        printf("%c: %d\n",i,charCount[i]); 
      } 
    } 
1

私は少し修正して、この方法で独自のコードをクリア:

  1. 未使用の変数の宣言を削除します。
  2. すべての宣言をの上に置きます。
  3. 役に立たないコマンドを削除しています。
  4. シンボル'A'から6597'a'として"マジック"番号の変更 - はい、char数字です。
  5. コメントコードの個々の部分については、
  6. と - エラーの修正、主に - もちろん:2 連続
    1. resetingカウンター、(元の状態に||
    2. 分割シンボルの不連続範囲。

だから、完全なコードは以下のようになります。

#include <stdio.h> 

int main() { 
    int i, count = 0, counts[50] = { 0 }; 
    char str[100]; 

    printf("Write a string not more than 50 chars:\n"); 
    gets(str); 

    /* Counting capital letters and all symbols, too*/ 
    i = 0; 
    while (str[i] != '\0') { 
     if (str[i] >= 'A' && str[i] <= 'Z') { 
      counts[str[i] - 'A']++; 
     } 
     i++; 
     count++; 
    } 

    /* ... and printing results */ 
    for (i = 0; i < 50; i++) { 
     if (counts[i] != 0) { 
      printf("%c: %d\n", i + 'A', counts[i]); 
     } 
    } 

    /* ... and clear the counter */ 
    for (i = 0; i < 50; i++) 
     counts[i] = 0; 

    /* Counting small letters */ 
    i = 0; 
    while (str[i] != '\0') { 
     if (str[i] >= 'a' && str[i] <= 'z') { 
      counts[str[i] - 'a']++; 
     } 
     i++; 
    } 

    /* ... and printing results */ 
    for (i = 0; i < 50; i++) { 
     if (counts[i] != 0) { 
      printf("%c: %d\n", i + 'a', counts[i]); 
     } 
    } 

    /* ... and clear the counter */ 
    for (i = 0; i < 50; i++) 
     counts[i] = 0; 

    /* Counting symbols between SPACE and 'A' */ 
    i = 0; 
    while (str[i] != '\0') { 
     if ((str[i] >= ' ' && str[i] < 'A')) { 
      counts[str[i] - ' ']++; 
     } 
     i++; 
    } 

    /* ... and printing results */ 
    for (i = 0; i < 50; i++) { 
     if (counts[i] != 0) { 
      printf("%c: %d\n", i + ' ', counts[i]); 
     } 
    } 

    /* ... and clear the counter */ 
    for (i = 0; i < 50; i++) 
     counts[i] = 0; 

    /* Counting symbols over 'z' */ 
    i = 0; 
    while (str[i] != '\0') { 
     if ((str[i] >= 123 && str[i] <= 126)) { 
      counts[str[i] - 123]++; 
     } 
     i++; 
    } 

    /* ... and printing results */ 
    for (i = 0; i < 50; i++) { 
     if (counts[i] != 0) { 
      //if((i) < 127) 
      printf("%c: %d\n", i + 123, counts[i]); 
     } 
    } 


    printf("Total amount of char: %d\n", count); 
    str[i] = '\0'; 
    system("pause"); 
    system("cls"); 
    return 0; 
} 

私はそれをテストし、今ではOKの作品 - それにもかかわらず、まだ醜いです。しかし、それは優位にコードですのでを理解するでしょう

+0

'gets'を使わないでください。 'str [i] = '\ 0'を削除する;' – BLUEPIXY

関連する問題