我目前正在设计一段代码,其中的指令是获取十六进制字符串的前两位并进行所需操作。所有小于A的内容都会被考虑在内,而大于A的内容则不会,它只会取下一个数字。这会导致代码出错。
以下是转换代码:
int x = atoi(hex.c_str);
我做错了什么?
我目前正在设计一段代码,其中的指令是获取十六进制字符串的前两位并进行所需操作。所有小于A的内容都会被考虑在内,而大于A的内容则不会,它只会取下一个数字。这会导致代码出错。
以下是转换代码:
int x = atoi(hex.c_str);
我做错了什么?
使用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
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" );
}
std::hex
流修饰符来实现(注意我这次将字符串命名为mystr
以避免混淆,特别是如果你已经导入了std
命名空间)。int x;
std::istringstream iss(mystr);
bool ok = (iss >> std::hex >> x);
[编辑] 我注意到你在评论中询问转换为无符号整数。在这种情况下,为什么不明确声明您的整数为unsigned int
?
对于无符号整数,您应该使用strtoul
。
strtoul
函数 - 可以使用前缀0x
或指定基数为16。虽然strtol
函数也可以正常工作,但它返回的是有符号值,因此在某些编译器中,您可能会收到有关混合有符号和无符号类型的警告信息。
error: too few arguments to function 'long int strtol(const char*, char**, int)'
。 - Julio Garcia