当我输入时 0x123456789 我的输出不正确,我无法弄清楚原因。起初我认为这是一个最大可能的int值问题,但我将变量更改为unsigned long并且问题仍然存在。
#include <iostream>
using namespace std;
long htoi(char s[]);
int main()
{
cout << "Enter Hex \n";
char hexstring[20];
cin >> hexstring;
cout << htoi(hexstring) << "\n";
}
//Converts string to hex
long htoi(char s[])
{
int charsize = 0;
while (s[charsize] != '\0')
{
charsize++;
}
int base = 1;
unsigned long total = 0;
unsigned long multiplier = 1;
for (int i = charsize; i >= 0; i--)
{
if (s[i] == '0' || s[i] == 'x' || s[i] == 'X' || s[i] == '\0')
{
continue;
}
if ( (s[i] >= '0') && (s[i] <= '9') )
{
total = total + ((s[i] - '0') * multiplier);
multiplier = multiplier * 16UL;
continue;
}
if ((s[i] >= 'A') && (s[i] <= 'F'))
{
total = total + ((s[i] - '7') * multiplier); //'7' equals 55 in decimal, while 'A' equals 65
multiplier = multiplier * 16UL;
continue;
}
if ((s[i] >= 'a') && (s[i] <= 'f'))
{
total = total + ((s[i] - 'W') * multiplier); //W equals 87 in decimal, while 'a' equals 97
multiplier = multiplier * 16UL;
continue;
}
}
return total;
}
答案 0 :(得分:2)
long
也可能是您计算机上的32位。试试long long
。
答案 1 :(得分:1)
您需要超过32位才能存储该号码。你的long类型可能只有32位。
请改用std :: uint64_t。这始终是64位无符号类型。如果您的编译器不支持,请使用long long。那必须是至少64位。
答案 2 :(得分:1)
这个想法遵循一个数字的多项式性质。 123与
相同1 * 10 2 + 2 * 10 1 + 3 * 10 0
换句话说,我不得不将第一个数字乘以10 两次。我不得不将2乘以一次。我将最后一位数乘以1。再次,从左到右阅读:
我们会做同样的事情:
#include <cctype>
#include <ciso646>
#include <iostream>
using namespace std;
unsigned long long hextodec( const std::string& s )
{
unsigned long long result = 0;
for (char c : s)
{
result *= 16;
if (isdigit( c )) result |= c - '0';
else result |= toupper( c ) - 'A' + 10;
}
return result;
}
int main( int argc, char** argv )
{
cout << hextodec( argv[1] ) << "\n";
}
您可能会注意到该功能超过三行。为清楚起见,我这样做了。 C ++习语可以使该循环成为一行:
for (char c : s)
result = (result << 4) | (isdigit( c ) ? (c - '0') : (toupper( c ) - 'A' + 10));
如果您愿意,也可以进行验证。我所提供的并不是进行数字到价值转换的唯一方式。还有其他方法同样好(有些方法更好)。
我希望这会有所帮助。
答案 3 :(得分:0)
当我输入&#34; 1234567890&#34;时,我发现了发生了什么。它会跳过&#39; 0&#39; 0所以我不得不修改代码。另一个问题是long确实是32位,所以我按照@Bathsheba的建议将其改为uint64_t。这是最终的工作代码。
#include <iostream>
using namespace std;
uint64_t htoi(char s[]);
int main()
{
char hexstring[20];
cin >> hexstring;
cout << htoi(hexstring) << "\n";
}
//Converts string to hex
uint64_t htoi(char s[])
{
int charsize = 0;
while (s[charsize] != '\0')
{
charsize++;
}
int base = 1;
uint64_t total = 0;
uint64_t multiplier = 1;
for (int i = charsize; i >= 0; i--)
{
if (s[i] == 'x' || s[i] == 'X' || s[i] == '\0')
{
continue;
}
if ( (s[i] >= '0') && (s[i] <= '9') )
{
total = total + ((uint64_t)(s[i] - '0') * multiplier);
multiplier = multiplier * 16;
continue;
}
if ((s[i] >= 'A') && (s[i] <= 'F'))
{
total = total + ((uint64_t)(s[i] - '7') * multiplier); //'7' equals 55 in decimal, while 'A' equals 65
multiplier = multiplier * 16;
continue;
}
if ((s[i] >= 'a') && (s[i] <= 'f'))
{
total = total + ((uint64_t)(s[i] - 'W') * multiplier); //W equals 87 in decimal, while 'a' equals 97
multiplier = multiplier * 16;
continue;
}
}
return total;
}