- 締切済み
英小文字個数のカウントについて(C)
はじめまして。 勉強中の初心者です。 みなさんの質問に対し、すぐに詳しい方々が親切な回答をされている為、 よく閲覧させていただいております。 #include <stdio.h> int main(int argc, char *argv[]) { char countmoji; int count[26], i; if ((argc == 1)||(argc > 2)) { printf("Usage : ALFSCH <strring>\n\n"); exit(0); } for (countmoji = 0x61; countmoji <= 0x7a; countmoji++) { count[countmoji] = 0; } i=0; while (argv[1][i] != '\0') { countmoji = argv[1][i]; count[countmoji]++; i++; } for(countmoji = 0x61; countmoji <= 0x7a;countmoji++) { if (count[countmoji] >= 1) { printf("%C :%4d \n", countmoji, count[countmoji]); } } return 0; } 上司からだされた練習用課題の一部です。 上記のソースで正確に動いてはいるんですが、上司から「間違ってはいないけど、中途半端なトコからメモリを使うな」とのことでして。 当方、組込み系の職場なので、メモリに関しては特にうるさいみたいです。 どう直したらよいのか困っております。 おそらく argv[0]→ox61 から argv[25]→0x7a のように頭から無駄なく使えと言っていることまではわかりました。 これをどう表現したらいいのかが。。。 Linux Fedora Core 6を使用しております。 お恥ずかしい質問ではございますが、よろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- sakusaker7
- ベストアンサー率62% (800/1280)
本当に「間違っていない」って言われた状態のソースですか? int count[26], i; と宣言しているのだから、count は 0~25までしかありません。 なのに for (countmoji = 0x61; countmoji <= 0x7a; countmoji++) { count[countmoji] = 0; 思いっきり別のところをアクセスしているようですけど? 悪くするとスタックの内容をぶっ潰してプログラムが昇天します。 それはおいといて > おそらく argv[0]→ox61 から argv[25]→0x7a のように頭から無駄なく > 使えと言っていることまではわかりました。 countmoji が保持する値が下駄はいているとみなせばいいのでは? count[countmoji]++; を count[countmoji-'a']++; のようにするとか。
- RAPTsong
- ベストアンサー率42% (74/175)
int count[26] なのに、 for (countmoji = 0x61; countmoji <= 0x7a; countmoji++) { count[countmoji] = 0; } これでは、範囲外アクセスです。 count[ countmoji - 0x61 ] のようにする必要があります。 また、入力文字が想定外のときの処理が入っていません。
お礼
ありがとうございます。 参考にして試してみます。
お礼
ありがとうございます。 さっそく試してみます