ページ 11

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

Posted: 2015年8月11日(火) 12:41
by 大学生
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;
}


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

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

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

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

Posted: 2015年8月11日(火) 23:28
by box

コード:

//与えられた英文に含まれる、各アルファベットの数を数えるプログラムを作成して下さい。 なお、小文字と大文字は区別しません。
//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について

Posted: 2015年8月12日(水) 00:17
by 大学生
>みけCATさん

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

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