2016-04-27 27 views
-2

ユーザーが入力した文字列の文字頻度を計算するプログラムを作成しました。それはすべての小文字に正しい出力を与えていますが、大文字では機能しません。コード内で問題を見つけることができません:Cで文字列の文字周波数を計算する

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char string[100]; 
    int c = 0, count[26] = {0}; 

    printf("Enter a string\n"); 
    fgets(string,100,stdin); 

    while(string[c] != '\n') { 
     c++; 
    } 
    string[c] = '\0'; 
    c = 0; 

    while (string[c] != '\0') 
    { 
     /** Considering characters from 'a' to 'z' only 
      and ignoring others */ 

     if (string[c] >= 'a' && string[c] <= 'z') 
     count[string[c]-'a']++; 
     else if(string[c] >= 'A' && string[c]<= 'Z') 
     count[string[c]-'A']++; 

     c++; 
    } 

    for (c = 0; c < 26; c++) 
    { 
     /** Printing only those characters 
      whose count is at least 1 */ 

     if (count[c] != 0) 
     printf("%c occurs %d times in the entered string.\n",c+'a',count[c]); 
    } 

    return 0; 
} 

助けてください!

ここはスクリーンショットです。うまくいけば、私が直面していますどのような問題を理解する:

enter image description here

それは大文字を数えていません。 fgets()末尾'\0'を保証し、後であなたの小切手で優雅に'\n'を扱うので、私が見ることができる

+3

'(文字列[C] =「ながら\ n個! ') 'は危険です。ユーザーが100文字以上を入力した場合はどうなりますか? –

+3

私はあなたの問題を再現できません - それは私のために正常に動作します。 –

+1

ここでもうまく動作します。 – totoro

答えて

2

正常に動作しますが、出力が混乱する可能性があります。入力文字列「foo」というの場合

、出力はこれです:

f occurs 1 times in the entered string. 
o occurs 2 times in the entered string. 

、小文字と大文字が一緒にカウントされますので、あなたは「Fが1回発生」が表示されない

http://ideone.com/ACJnPD

+0

ありがとう!あなたのコードは、私が間違っていたことを私に示しました。 –

+0

@BitanBasakあなたが間違っていると分かったことを聞いてもよろしいですか? – totoro

3

唯一の問題は、境界である...

EDIT

は、これは完全にスキップすることができます。それは

while(string[c] && string[c] != '\n') { 
    c++; 
} 
string[c] = '\0'; 

while (string[c] != '\0') 

あるべき'\n'を削除するには

while(string[c] != '\n') { 
    c++; 
} 
string[c] = '\0'; 

は理由fgets()の意味で良いです。

+4

'while(c <100 && string [c]!= '\ 0')'は必要ありません。 'string [c]!= '\ 0''で十分です。 'fgets()'がNULLを返さない場合、 'string []'はヌル文字で終了します。 – chux

+0

@chux 'fgets()'についてはわかりませんでした。 – totoro

+2

コーナーケース: 'stdin'が閉じられたとき、' fgets() 'は100文字未満の' string [] 'を返しても' \ n''を返しません。そのような場合、 'string [c] = '\ 0';'が問題になります。興味深いことに、潜在的な '' \ n ''を取り除くコードは必要ありません。 – chux

0

問題は、あなたが周波数をカウントする異なるアレイを使用することができアッパーの別々のカウント数と小文字であることがIGuessing:

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char string[100]; 
    int c = 0, countLower[26] = {0}; 
    int countUpper[26] = {0}; 

    printf("Enter a string\n"); 
    fgets(string,100,stdin); 

    while((string[c] != '\0') && (string[c] != '\n')) { 
     c++; 
    } 

    string[c] = '\0'; 
    c = 0; 

    while (string[c] != '\0') 
    { 
     /** Considering characters from 'a' to 'z' only 
      and ignoring others */ 

     if (string[c] >= 'a' && string[c] <= 'z') 
      countLower[string[c]-'a']++; 
     else if(string[c] >= 'A' && string[c]<= 'Z') 
      countUpper[string[c]-'A']++; 

     c++; 
    } 

    for (c = 0; c < 26; c++) 
    { 
     /** Printing only those characters 
      whose count is at least 1 */ 

     if (countLower[c] != 0) 
     printf("%c occurs %d times in the entered string.\n",c+'a',countLower[c]); 
     if (countUpper[c] != 0) 
     printf("%c occurs %d times in the entered string.\n",c+'A',countUpper[c]); 
    } 

    return 0; 
} 
関連する問題