【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.22843

英数字カウント
投稿者---kura(2005/08/27 03:03:27)


ファイルを読み込んで、半角英数をa〜jまでカウントして表示する、簡単なプログラムを作りたいのですが、改行を上手く読み飛ばすことが出来ません。どなたか、よければ改行の読み飛ばし方を教えて下さい。

改行を含まないファイルを、カウントするプログラムまでは何とか作成できたので下記にソースを載せておきます。

なにぶん、初心者なものでおてやわらかにお願いします。

(英数カウント:ソース)

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
FILE *fp;
char s[256]={0};
char csmole[10]={'a','b','c','d','e','f','g','h','i','j'};
char cbig [10]={'A','B','C','D','E','F','G','H','I','J'};
int i=0,j=0,c=0;
int a[26]={0};


fp = fopen("sample.txt","r");

if(fp == NULL){
printf("ファイルのオープンに失敗しました。\n");
exit(2);
}
else{
printf("ファイルをオープンしました。\n");
}

while (fgets(s, 256, fp) != NULL) {
for(s[i];s[i]!=NULL;i++){
for(j=0;j<=9;j++){
if(s[i]==(csmole[j])||s[i]==(cbig[j])){
a[j]++;
}
}
}
}
for(i=0;i<=9;i++){
printf("%c",csmole[i]);
printf("%3d",a[i]);
printf(" ");
for(j=0;j<a[i];j++){
printf("*");
}
printf("\n");
}

fclose(fp);
printf("ファイルをクローズしました。\n");

return 0;
}

(sample.txt)

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(改行)
bbbbbbbbbb(改行)
cccccccccccccccccc(改行)
ddddddddddddddddddddddddd(改行)
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee(改行)
fffffffff(改行)
ggggg(改行)
hhhhhhhhhhhhhhhhhhhhhhh(改行)
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(改行)



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:英数字カウント 22852 RAPT 2005/08/27 09:07:42


No.22852

Re:英数字カウント
投稿者---RAPT(2005/08/27 09:07:42)


※ソースの添付は「HTML変換ツール」で字下げ!

> 改行を上手く読み飛ばすことが出来ません。
for文の処理で、s[i] != NULL としているところを、
s[i] != '\0' && s[i] != '\n' とすればいいでしょう。

※C言語で s[i] と NULL を比較するのは正しくありません。
 文字列終端文字かどうかを確認するには、'\0'と比較します。

# スレ主投稿のソースは「英数字カウント」とありつつも「英字」しか
# カウントしていないけど、どちらが正しいのかな。。

主となる処理部分はもっと簡単に書けます。
下記のサンプルコードは参考になるでしょうか。


#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main(void)
{
    FILE *fp = NULL;
    char buff[256] = {0};
    int i = 0, j = 0, c = 0;
    int a[26] = {0};

    fp = fopen("sample.txt","r");
    if(fp == NULL){
        printf("ファイルのオープンに失敗しました。\n");
        exit(2);
    }
    else{
        printf("ファイルをオープンしました。\n");
    }

    while (fgets(buff, sizeof(buff), fp) != NULL) {
        // 読み込んだ文字が終端文字か、改行文字であればループを終了
        for(i = 0; buff[i] != '\0' && buff[i] != '\n'; i++){
            // 注目する文字を小文字に変換
            c = tolower(buff[i]);
            if( c >= 'a' && c <= 'j'){
                // 'a'の文字コードは97なので、c=='a' のとき c - 'a' は 0 となる
                a[c - 'a']++;
            }
        }
    }

    for(i = 0; i < 10; i++){
        // printf()は可変個引数を取るのでまとめて書ける
        printf("%c%3d ", 'a' + i, a[i]);
        for(j = 0; j < a[i]; j++){
            printf("*");
        }
        printf("\n");
    }

    fclose(fp);
    printf("ファイルをクローズしました。\n");

    return 0;
}




この投稿にコメントする

削除パスワード

No.22855

Re:英数字カウント
投稿者---kura(2005/08/27 12:09:03)


PARTさん、ありがとうございました。
数字は含みません英字だけでした、表記ミスです、すみませんでした。
意図した通りに動かす事が出来ました。
また、つまった時はアドバイスよろしくお願いします。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧