将十六进制字符串转换为无符号整数的问题 C++

5

我目前正在设计一段代码,其中的指令是获取十六进制字符串的前两位并进行所需操作。所有小于A的内容都会被考虑在内,而大于A的内容则不会,它只会取下一个数字。这会导致代码出错。

以下是转换代码:

int x = atoi(hex.c_str);

我做错了什么?


2
你正在使用atoi函数。(请阅读规范。) - Hot Licks
1
尝试使用基数为16的strtol函数。 - Hot Licks
好的,我们还有其他指令可以用来将十六进制字符串转换为无符号整数吗? - Julio Garcia
现在我得到了一个错误:error: too few arguments to function 'long int strtol(const char*, char**, int)' - Julio Garcia
起初没有阅读文档,失败了 >.< - Lightness Races in Orbit
4个回答

15
我假设您的意思是,您想将字符串的前两个十六进制数字转换为无符号整数。我还假设该字符串仅包含有效的十六进制数字。如果您想验证该字符串,需要编写一些额外的代码。

使用strtoul将十六进制字符串转换为无符号整数。还可以使用字符串类的substr()方法提取十六进制字符串的前两个数字。

#include <string>
#include <cstdio>
#include <cstdlib>

int main()
{
    std::string myhex = "abcdef";
    unsigned int x = strtoul(myhex.substr(0, 2).c_str(), NULL, 16);
    printf("x = %d\n", x);
}

这将是您的输出(即0xab = 171):

x = 171

1

atoi函数需要使用十进制。

建议改用例如strtol

通常阅读文档是个好主意。只需将函数名称输入AltaVista(或者Google),就能找到相关文档。


哇!我不知道Altavista还存在呢! - Hot Licks
它停止存在于2013年7月8日。现在只是重定向到Yahoo! - nikoliazekter

1
int x = strtol(hex.c_str(), NULL, 16);

你也可以使用 sscanf 来读取部分字符串。你提到可能只想要前两个字符:
int x;
if( 1 == sscanf(hex.c_str(), "%2x", &x) ) {
    printf( "Value is: %d\n", x );
} else {
    printf( "Conversion failed\n" );
}

注意上面的代码并不是真正的C++。你可以使用std::hex流修饰符来实现(注意我这次将字符串命名为mystr以避免混淆,特别是如果你已经导入了std命名空间)。
int x;
std::istringstream iss(mystr);
bool ok = (iss >> std::hex >> x);

[编辑] 我注意到你在评论中询问转换为无符号整数。在这种情况下,为什么不明确声明您的整数为unsigned int

对于无符号整数,您应该使用strtoul


0
如果您要转换为无符号类型,您可能希望使用strtoul函数 - 可以使用前缀0x或指定基数为16。虽然strtol函数也可以正常工作,但它返回的是有符号值,因此在某些编译器中,您可能会收到有关混合有符号和无符号类型的警告信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接