我目前正在设计代码,其中一条指令是获取十六进制字符串的前两位数并执行所需的操作。所有小于A的东西都被考虑在内。任何大于此的东西都不是,它只需要下一个数字。这搞砸了代码。
以下是转换它的行:
int x = atoi(hex.c_str);
我做错了什么?
答案 0 :(得分:14)
我假设这是你的意思 - 你只想将字符串的前两个十六进制数字转换为无符号整数。我还假设字符串只包含有效的十六进制数字。如果要验证字符串,则需要为此编写一些额外的代码。
使用strtoul
将十六进制字符串转换为无符号整数。还可以使用字符串类的substr()
方法仅提取十六进制字符串的初始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
答案 1 :(得分: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);
[edit]我在评论中注意到您要求转换为无符号整数。在这种情况下,为什么你没有明确地将整数声明为unsigned int
?
对于未签名的,您应该使用strtoul
。
答案 2 :(得分:1)
答案 3 :(得分:0)
如果您要转换为未签名,您可能希望使用strtoul
- 前缀为0x
或基数为16. strtol
也可能有效正确,但这应该给出一个有符号的值,所以至少你可能会收到来自某些编译器的有符号和无符号混合警告。