• 締切済み

処理内容

以下の3点について有識者へ伺いたいです。 (1)このプログラムが何をするものなのか (2)最後のfor文が無限ループしてしまう理由 (3)可能であれば、各行(各処理)が何をしているのかを教えていただければ嬉しいです。 #include <stdio.h> #include <string.h> #define NUM_HASH 10 char *hash_key[NUM_HASH]; unsigned char hash_val[NUM_HASH]; unsigned char calc_hash_value(const char *key) { int i; unsigned char val = 0; for (i = 0; key[i] != '\0'; i++) val += key[i]; return val; } int main(int argc, char *argv[]) { int i, cnt = 0; unsigned char val; for (--argc, ++argv; argc > 0 && cnt < sizeof(hash_val)/sizeof(hash_val[0]); --argc, ++argv, cnt++) { hash_key[cnt] = *argv; hash_val[cnt] = calc_hash_value(hash_key[cnt]); } for (val = 0; val < 256; val++) { for (i = 0; i < cnt; i++) { if (val == hash_val[i]) { printf("key = |"%s|"|n", hash_key[i]); printf("hash value = 0x%.2X|n", hash_val[i]); } } } return 0; }

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.4

unsigned charの値域を良く考えて見ましょう unsigned charで 256(0x100)が表現できるのかどうか ・・・

ya-cha
質問者

お礼

ご回答ありがとうございました。 unsigned char は 0~255まででした! for文でvalの値が256になるタイミングでオーバフローしてしまうという事ですね!? ありがとうございました!

  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.3

確かにこれでは永久にループしますね。 これが故意でなければ、プログラムの意図も探る 根拠があるのかな? と思います。 プログラムの意図も分からない、完成もしていな い、そんなプログラムについて質問される理由に 興味があります。何故?

ya-cha
質問者

お礼

ご回答ありがとうございます。 もし可能であれば、なぜ無限ループしてしまうのか教えてください。 お願いいたします。 ちなみに、無限ループしてしまうのは故意です。 質問するのは、この問題を今解いていて、分からないだけです。

  • arain
  • ベストアンサー率27% (292/1049)
回答No.2

>(1)このプログラムが何をするものなのか >(3)可能であれば、各行(各処理)が何をしているのかを教えていただければ嬉しいです。 入手した先から確認すればいいだけでは? >(2)最後のfor文が無限ループしてしまう理由 こっち for (val = 0; val < 256; val++) なら、 オーバフロー起こしてるから永久にループする。

ya-cha
質問者

お礼

ご回答ありがとうございます。 入手先への確認が不可能なのでこちらへしつもんさせていただきました。 また、ほとんど知識が無いのでよく分かりませんが、オーバフローしてしまうというのはどういう意味ですか? たびたび恐れ入りますが、可能であればご回答をお願いいたします。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

そのままコピー&ペーストしてコンパイルしたところ、 > printf("key = |"%s|"|n", hash_key[i]); この行でエラーが出ました。 こちらが勝手に修正すると、お手元のコードと食い違ってしまうおそれがあります。 そこで、コンパイルエラーが出ないコードをあらためて載せていただけますか?

ya-cha
質問者

お礼

ご回答ありがとうございます。 すいませんでした。以下の出力処理を間違えていました。 誤) printf("key = |"%s|"|n", hash_key[i]); printf("hash value = 0x%.2X|n", hash_val[i]); 正) printf("key = \"%s\"\n", hash_key[i]); printf("hash value = 0x%.2X\n", hash_val[i]); 以上、よろしくお願いいたします。

関連するQ&A