これitoa()
は、C-String を返すためです。
すべての C-String は ( と同様にtemp[30]
) バッファーですが、すべてのバッファーが C-String であるとは限りません。
C-String には、有効なもののリストからの文字 (英数字 + いくつかの記号 + など) を含める必要があり、「文字列ターミネータ」(文字'\0'
)で終了する必要があります。
あなたのtemp
変数は初期化されていません(まだ文字列ではなく、汎用バッファとして生まれたと言えます)。そのためitoa()
、「数値」を文字列に変換した後(バッファはC文字列になりました)、文字列の後にターミネータ ( '\0'
) を初期化していないと、ゴミが残ります。
バッファは次のようになります。
temp[30] = { '1', '2', '3', '\0', ?, ?, ?, ..., ? }
? _ は何でもかまいません...
バッファtemp[30]全体をループするため、常にさまざまなものの合計を作成します。
- 解決策 1: char temp[30] = { 0 } を初期化します (少しばかげていますが、有効です)。
- 解決策 2:バッファ全体ではなく、 C-String の「長さ」までループします
temp
(これはより理にかなっています!)
これこれ:
size_t length( strlen( temp ) );
for ( size_t i( 0 ); i < length; i++ )
{
hash += (int)i * temp[ i ];
}