- ベストアンサー
文字カウンタ
英語の文章中で、二文字単位で読み取って、その文字列の数を出力しようと思っています。 例 hello hey you → he:2 ll:1 o :1 y :1 yo:1 u :1 解析に用いるのは、C言語でなくても、エクセルでもUNIXコマンドでも構いませんが、とりあえず、文字をカウントしたいです。 C言語での文字カウンタを作ってみたのですが、一文字単位で読みとるものしか作れませんでした。 #include <stdio.h> #include <ctype.h> int main( void ) { int ch, i; int alpcnt[26] = {0}; printf( "文字を入力\n" ); while ( ( ch = getchar( ) ) != EOF ) { if ( isupper( ch ) != 0 ) { alpcnt[ch-'A']++; } else if ( islower( ch ) != 0 ) { alpcnt[ch-'a']++; } } for ( i = 0;i < 26; i++ ) { printf( "%c : %3d個入力\t\t", 'a'+i, alpcnt[i] ); if ( i%3 == 2 ) putchar( '\n' ); } return 0; } これを少し改造するだけで作れますでしょうか? 宜しくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
なんでもいいということなのでPerlで while($line=<>){ chomp $line; #改行は捨てる $line .=" " if((length $line) % 2 == 1); #1文字余る時は空白を1つ付与する @list=split /(..)/, $line; #2文字で分ける? foreach $key (@list){ $count{$key}++ if $key ne "";#空文字以外を数える } } foreach $key (sort keys %count){#ソートして出力 print "$key:$count{$key}\n"; } __END__ hello hey you hey you what your name
その他の回答 (1)
- anmochi
- ベストアンサー率65% (1332/2045)
2文字単位にカウントするなら、カウンタは2次元の配列じゃないといけないんじゃないかな。C言語では配列の配列になる。 int alpcnt[26][26]; さらに、半角スペースも入れるなら26個じゃ足りない。面倒だし7F×7Fのマトリックスにしたらどうだろう。コントロール文字の分が不要なら5F×5Fでも良いけど。 int alpcnt[0x80][0x80]; で、こんな形にするのは訳がある。メインルーチンは面倒なので2文字目を入れないとカウントしないようにする。 while(1) { if((ch1 = getchar()) == EOF) break; if((ch2 = getchar()) == EOF) break; alpcnt[ch1][ch2]++; /* 文字のASCIIをキーとしてそのままカウント */ } 後は必要な分だけを出力してあげれば良い。とりあえず全部出力するとこんな感じ。これは、途中の表示できない文字も全部出すので、このままの利用は控えるように。 for(y = 0x20; y <= 0x7f; y++) { for(x = 0x20; x <= 0x7f; x++) { printf("%c%c is %d\n", x, y, alpcnt[x][y]); } } また、君が作っている通り、大文字と小文字を一緒にするなら出力の段階で足し合わせてあげると良い。例えば[0x62][0x62]と[0x42][0x42]をたち合わせて表示するとか。
お礼
ご回答ありがとうございます。 配列を使えば、2文字単位で処理できますけど、画面に出力するときに、全部表示されてしまうんですよね。そこがまた難しいです。。
お礼
ご回答ありがとうございました。