这是因为itoa()
返回一个 C 字符串。
每个 C-String 都是一个缓冲区(就像temp[30]
),但不是每个缓冲区都是一个 C-String。
C-String 必须包含来自有效事物列表的字符(字母数字 + 一些符号 + 等),并且必须以“字符串终止符”(字符'\0'
)结尾
你的temp
变量没有初始化(我们可以说它是作为一个通用缓冲区诞生的,而不是一个字符串),所以在itoa()
你将你的“数字”转换为字符串之后(你的缓冲区刚刚变成了一个 C 字符串),但是在字符串之后terminator ( '\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 ];
}