文字のカウントとEOFについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
大学生

文字のカウントとEOFについて

#1

投稿記事 by 大学生 » 10年前

AOJで(言語はC)文字のカウントをするプログラムをかいていたのですが、こちらのコードをターミナルでコンパイルしても (1) に注意書きがでてしまい、実行できないのですがなぜでしょうか??
また、注意書きが出たにもかかわらずダメ元でAOJに投稿するとOKとなってしまいました。ますます意味が分かりません。
また、よければEOFについての意味も教えて下さると助かります。よろしくお願いしますm(_ _)m

コード:

//与えられた英文に含まれる、各アルファベットの数を数えるプログラムを作成して下さい。 なお、小文字と大文字は区別しません。
//http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_8_C
#include <stdio.h>

int main(int argc, const char * argv[]) {
    
    int i;
    int a[26] = {0};  //アルファベット('a'-'z')は26文字
    char ch[1201];
    
    //input
    while ( scanf("%s", &ch) != EOF) {  //...(1)
        //走査
        for (i=0; ch[i]!='\0'; i++) {
            
            if ('a'<=ch[i] && ch[i] <='z') {
                a[ch[i]-'a']++;  //小文字から 'a' を引くと対応した番号が得られる
            }
            if ('A'<=ch[i] && ch[i] <='Z') {
                a[ch[i]-'A']++;  //大文字から 'A' を引くと対応した番号が得られる
            }
        }
    }
    
    //output
    for(i=0; i<26; i++){
        printf("%c : %d\n", i+'a', a[i]);  //0+'a' = 'a' つまり0=a, 1=b, 2=c, ... になる
    }
    
    return 0;
}


アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: 文字のカウントとEOFについて

#2

投稿記事 by みけCAT » 10年前

大学生 さんが書きました:こちらのコードをターミナルでコンパイルしても (1) に注意書きがでてしまい、
おそらく、型が一致していないからですね。
%sはchar*型のデータを期待しますが、&chは(*)[1201]型です。

もしくは、Visual C++を使用している場合はコンパイラが対応していないかもしれません。
その場合は、gccなど他のコンパイラを使用することをおすすめします。
大学生 さんが書きました:実行できないのですがなぜでしょうか??
gccの-Werrorオプション、もしくは他のコンパイラの同等のオプションを使用しているか、宗教上の理由(or「こだわり」)でしょうか?
それともウィルス対策ソフトもしくはセキュリティソフト、OSの設定による制限などのせいでしょうか?
大学生 さんが書きました:また、注意書きが出たにもかかわらずダメ元でAOJに投稿するとOKとなってしまいました。
chが表す先頭要素のポインタと、&chが表す配列の先頭のポインタがたまたま一致しているからでしょう。
大学生 さんが書きました:また、よければEOFについての意味も教えて下さると助かります。
EOFは入力の終わりを示す値で、どの文字とも被らないようになっているはずです(そのためchar型では表現できない)。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 15年前

Re: 文字のカウントとEOFについて

#3

投稿記事 by box » 10年前

コード:

//与えられた英文に含まれる、各アルファベットの数を数えるプログラムを作成して下さい。 なお、小文字と大文字は区別しません。
//http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_8_C
#include <stdio.h>
#include <ctype.h>

#define N (26)

int main(void)
{
    int a[N] = { 0 };       // アルファベット('a'-'z')は26文字
    // char ch[1201];       // 配列にする必要性を感じません
    int ch, i;

    //input
    while ((ch = getchar()) != EOF) {
        //走査
        if (islower(ch)) {
            a[ch - 'a']++;
        }
        if (isupper(ch)) {
            a[ch - 'A']++;
        }
    }

    //output
    for (i = 0; i < N; i++) {
        printf("%c : %d\n", i + 'a', a[i]);  //0+'a' = 'a' つまり0=a, 1=b, 2=c, ... になる
    }
    return 0;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

大学生

Re: 文字のカウントとEOFについて

#4

投稿記事 by 大学生 » 10年前

>みけCATさん

なるほど!確かに型が違うためそこで警告されていました。ありがとうございます。
EOFの意味も多少理解できました。ありがとうございました!(^^)

>boxさん
#include <ctype.h>や、getchar()を使う発想はなかったです!すごく参考になりました。ありがとうございます(^^)

閉鎖

“C言語何でも質問掲示板” へ戻る