我目前正在设计一个代码,给出的指令之一是获取十六进制字符串的前两位数字并执行所需的操作。小于 A 的所有内容都被考虑在内。任何大于它的都不是,它只需要下一个数字。这弄乱了代码。
这是转换它的行:
int x = atoi(hex.c_str);
我究竟做错了什么?
我目前正在设计一个代码,给出的指令之一是获取十六进制字符串的前两位数字并执行所需的操作。小于 A 的所有内容都被考虑在内。任何大于它的都不是,它只需要下一个数字。这弄乱了代码。
这是转换它的行:
int x = atoi(hex.c_str);
我究竟做错了什么?
我假设这就是您的意思-您只想将字符串的前两个十六进制数字转换为无符号整数。我还假设该字符串仅包含有效的十六进制数字。如果要验证字符串,则需要为此编写一些额外的代码。
用于strtoul
将十六进制字符串转换为无符号整数。也可以使用substr()
string 类的方法只提取十六进制字符串的前 2 位。
#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" );
}
请注意,上面并不是真正的 C++。您可以为此使用std::hex
流修饰符(请注意,我mystr
这次调用了您的字符串以避免混淆(特别是如果您已经导入了命名空间std
):
int x;
std::istringstream iss(mystr);
bool ok = (iss >> std::hex >> x);
[编辑] 我注意到您在评论中询问有关转换为无符号整数的问题。在那种情况下,你为什么不明确声明你的整数为unsigned int
?
对于未签名的,您应该使用strtoul
.
如果您要转换为无符号数,您可能希望使用strtoul
- 前缀为0x
16 或基数为 16。它也可能strtol
正常工作,但应该给出一个有符号值,所以至少你可能会收到一些编译器混合有符号和无符号的警告。