![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
#include<stdio.h>
typedef struct stat {
char alph;
int count;
}Stat;
int main(int argc, char *argv[]){
FILE *fp;
int i=0,j=0;
char rv[1000],c;
Stat tmp,al[26];
for(i=0;i<26;i++){
al[i].alph='a'+i;
al[i].count=0;
}
if(argc==2){
fp = fopen(argv[1],"r");
if(fp==NULL){
printf("not found.\n");
exit(1);
}
}
else{
printf("Can not open.\n");
}
while((c=fgetc(fp))!=EOF){
c=rv[i];
if( 'A'<=rv[i] && rv[i]<='Z'){
rv[i] = rv[i] + ('a' - 'A');
}
i++;
}
i=0;
while(rv[i]!=EOF){
for(j=0;j<26;j++){
if(rv[i] == al[j].alph){
break;
} }
al[j].count++;
i++;
}
for(i=0;i<26;i++){
for(j=i+1;j<26;j++){
if(al[i].count > al[j].count){
tmp =al[i];
al[i]=al[j];
al[j]=tmp;
} } }
for(i=0;i<26;i++){
printf("%s %d\n",al[i].alph,al[i].count);
}
fclose(fp);
return 0;
}
コマンドラインで指定したファイルを読み、その中に出てくるアルファベット(a-z, A-Z)(aとAは同じ文字とカウント)の各文字の文字数をカウントし、カウント結果をソートして、たくさんカウントされたものから順に文字を表示する。
というプログラムなのですが、セグメントエラーとでてしまいます。どこが悪いのか指摘してください。
No.2ベストアンサー
- 回答日時:
★アドバイス
・ざっと見た限りでは fgetc() のループと
al[j].count のカウント部のループがおかしい。
・これ以上ソースをチェックするのが面倒なので同じものを作ってみた。
下のサンプルを参考に自分のソースを修正してみて下さい。
解説しないので読み取ってね。
サンプル:
#include <ctype.h>
#include <stdio.h>
// 構造体
typedef struct stat {
char alpha;
int count;
} Stat;
// メイン関数
int main( int argc, char *argv[] )
{
// 宣言
Stat stat[ 26 ];
Stat temp[ 1 ];
FILE *fp;
int i, c;
int j0, j1;
// 初期化
for ( i = 0, c = 'a' ; c <= 'z' ; c++, i++ ){
stat[ i ].alpha = (char)c;
stat[ i ].count = 0;
}
// 引数チェック
if ( argc != 2 ){
printf( "Can not open.\n" );
return 1;
}
if ( (fp = fopen(argv[1],"r")) == NULL ){
printf( "not found.\n" );
return 2;
}
// 読み込み
while ( (c = fgetc(fp)) != EOF ){
if ( isupper(c) ){
stat[ c - 'A' ].count++;
}
else if ( islower(c) ){
stat[ c - 'a' ].count++;
}
}
fclose( fp );
// バブルソート(降順)
for ( i = 25 ; i >= 0 ; i-- ){
for ( j1 = 1, j0 = 0 ; j0 < i ; j0++, j1++ ){
if ( stat[j0].count < stat[j1].count ){ ←『降順』なので符号が逆。
temp[ 0 ] = stat[ j0 ];
stat[ j0 ] = stat[ j1 ];
stat[ j1 ] = temp[ 0 ];
}
}
}
// 結果表示
for ( i = 0 ; i < 26 ; i++ ){
printf( "%c %d\n", stat[i].alpha, stat[i].count );
}
return 0;
}
以上。
No.1
- 回答日時:
少なくとも,
while (rv[i] != EOF)
は変. その前が「EOF でなかったら rv[i] に入れる」という感じになっているので, EOF が入っていると期待することはできない.
それとは別に, isupper とか tolower を使えよと言いたいけど, そこは本質的な問題じゃないのでとりあえず置いておく.
おお, よく見たら
c=rv[i];
なんてのもあるなぁ. 意味がわからん.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C言語 3 2022/11/09 13:27
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c言語でのfscanfについて
-
複数ファイルの同時読み込みの...
-
ファイルへの書込み処理が異常...
-
大量の入力ファイルを扱うとき...
-
fopenでファイル名に、変数を使...
-
C言語でのCSVソートとデータ抽...
-
テキストファイル内に対して, ...
-
二分探索木への挿入
-
C言語でセグメンテーションエ...
-
ファイル出力で改行を入れたい!
-
成績処理のプログラムについて...
-
ガンマ変換 C言語でプログラ...
-
fread()エラー
-
c言語による画像処理について
-
C言語にてXMLファイルから任意...
-
CSVファイルの内容を構造体に格...
-
C言語でファイル読み書きを早く...
-
エラーがわかりません、、
-
ファイルに行番号を追加
-
Enterキーを押されたら次の処理...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語でのfscanfについて
-
fopenでファイル名に、変数を使...
-
複数ファイルの同時読み込みの...
-
C言語でセグメンテーションエ...
-
C言語でファイル読み書きを早く...
-
ファイル出力で改行を入れたい!
-
エラーがわかりません、、
-
テキストファイル内に対して, ...
-
構造体のメンバにファイルポイ...
-
C言語にてXMLファイルから任意...
-
ガンマ変換 C言語でプログラ...
-
【C言語】ファイルを読み込んで...
-
日本語ファイル名のFTPについて
-
fscanfでループしてしまう。
-
CRC32の計算方法
-
fgets( ) の返り値は何?
-
VisualStudioでのファイルの入...
-
ファイルに行番号を追加
-
ファイルへの書込み処理が異常...
-
ファイルが読み込めない・・・
おすすめ情報