2016-12-03 5 views
0
#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 
#include<ctype.h> 
int main(int argc, char*argv[]){ 
    FILE *fp=fopen(argv[1],"r"); 
    int c; 
    int most; 
    int count[256]; 
    if (fp==NULL){ 
     printf("Error: %s does not exist\n",argv[1]); 
     exit(EXIT_FAILURE); 
    } 
    for(c=0; c<256; c++){ 
     count[c]=0; 
    } 

    while(c=fgetc(fp)){ 
    tolower(c); 
    int i; 
    if('a' <=c&& c<='z') 
     count[c-'a']++; 
    for(int i = 0; i<256;i++){ 
     if(count[i]>count[most]){ 
      most=i; 
     } 
    } 
} 

    printf("Most frequent letter is '%c', it appeared %d times.\n",most+'a',count[most]); 

fclose(fp); 
} 

okコマンドラインからtxtファイルを読み込み、どの文字が最も表示され、どのくらいの頻度で表示されるのかをcプログラムで作成するとします。コードを修正する方法がわかりません。私はそれを実行するときは起こらない。手紙の印刷が最も多く表示されます

+0

は、 "それはたまたまではありません。"では何が起こるのですか? – kaylum

+1

初期化されていない間は 'most'が使用されます。デバッガを使用してプログラムの実行をトレースすることで、コード内のこの問題やその他の問題を簡単に検出できます。 – kaylum

+0

コマンドラインパラメータが実際に存在することを保証するために 'argc'を最初にチェックせずに' argv [0] '以外に何もアクセスしないでください – user3629249

答えて

2

ライン:

tolower(c); 

は、あなたのプログラムでは何も有効ではありません。戻り値を取得する必要があります。また

c = tolower(c); 

、最も頻繁に発生する文字のインデックスを計算するforループはwhileループの外に移動する必要があります。

while((c=fgetc(fp)) != EOF) // Note the update to this line 
{ 
    c = tolower(c); 
    if('a' <= c && c <= 'z') 
    { 
     count[c-'a']++; 
    } 
} 

most = 0; 
for(int i = 0; i<256;i++) 
{ 
    if(count[i]>count[most]) 
    { 
     most=i; 
    } 
} 
2

掲載コードはいくつかの望ましくない要素の内容を使用してアルファベットの文字数について

  1. 誤解、
  2. 配列count[]の不要なトラバースの多く、
  3. が含まれています初期化されていない変数
  4. 組織が不足しています
  5. エラーメッセージ(正しくない可能性がある)、
  6. は、その内容が使用されていないヘッダファイルを含み、むしろ標準エラーより
  7. をstdoutとするはるか

次のコードが正常にコンパイルされ、所望の機能を実装します。ここuntitled.cという名前のファイルに上記のコードでは

#include<stdio.h> // fgetc(), fprint(), printf() fopen(), fclose() 
#include<stdlib.h> // exit(), EXIT_FAILURE 
#include<ctype.h> // tolower() 

#define MAX_ALPHABET (26) 

int main(int argc, char*argv[]) 
{ 
    if(argc < 2) 
    { // then no command line argument 
     fprintf(stderr, "USAGE: %s <fileNameToRead>\n", argv[0]); 
     exit(EXIT_FAILURE); 
    } 

    // implied else, command line argument exists 

    FILE *fp=fopen(argv[1],"r"); 
    if (!fp) 
    { // then fopen failed 
     perror("fopen failed"); 
     exit(EXIT_FAILURE); 
    } 

    // implied else, fopen successful 

    int c; 
    int count[ MAX_ALPHABET ] = {0}; 

    while(EOF != (c=fgetc(fp))) 
    { 
     c = tolower(c); 
     if('a' <= c && c <= 'z') 
     { 
      count[c-'a']++; 
     } 
    } 

    size_t most = 0; 
    for(size_t i=0; i<MAX_ALPHABET; i++) 
    { 
     if(count[i] > count[most]) 
     { 
      most = i; 
     } 
    } 


    printf("Most frequent letter is '%c', it appeared %d times.\n", (char)(most+'a'), count[most]); 

    fclose(fp); 
} 

は、コマンドラインである:

./untitled untitled.c 

、ここで出力されます。

Most frequent letter is 'e', it appeared 123 times. 
+0

if( 'a' <= c && c <= 'z') 'と'( 'a '<= c && c <=' z ')' 'for()'を削除してください。 – MayurK

+1

@MayurK、あなたの正しい、しかし、私はできるだけ短いではなく、できるだけ明確にコードを作ろうとしていました。 – user3629249

関連する問題