需要检查输入字符串中的十六进制值

时间:2010-01-11 19:55:26

标签: c++

我基本上试图让用户通过输入十六进制输入 getline into a string,因为我将对此进行其他操作。 (使用c ++ .net的东西不起作用)

我不想将其分解为每个人的字符,然后遍历字符串中的每个字符,看看它是否在[0-9]或[Aa-Ff]的范围内。

相反,我想知道是否有任何人知道的酷功能或更好的方法。我知道strtoul函数,但它返回一个很长的。这将迫使我然后我猜它将它传递给一个流,使其再次回到一个字符串。

另一件很长的事情我不确定我是否要担心64位长和32位长。我正在使用英特尔处理器在linx盒子上开发它,但它可以在unix盒子上使用,其处理器可能是64位我不确定。

所以我想这里有两个问题。任何帮助都是最受欢迎的

我可以得到答案: 你还可以评论我关于漫长的第二个问题吗?即使我现在不必担心...如果我使用32位系统保存一个长的变量....会改变(我想这样长度的大小应该在64位处理器上改变)这对变量中保存的信息意味着什么?第二,为了避免整个小/大端的事情,我把它保存在一个长期的思考中,因为它的种类注册不会是移植的问题。我认为这是错误的吗?

感谢

3 个答案:

答案 0 :(得分:2)

检查每个字符是唯一的方法,句号。

但是,您可能对 isxdigit(int character)感兴趣,如果传递的字符不是有效的十六进制字符,则返回0(请注意,x不包含在有效字符中)。 / p>

你可以使用算法测试它是否是一行中的十六进制字符串,虽然它有点难看。如果你正在使用Boost,你可以通过使用boost :: bind来实现它。

此代码段所需的标头是< locale>,< functional>和< algorithm&gt ;.

bool is_hex_string(std::string& str) {
  return std::count_if(str.begin(), str.end(), 
    std::not1(std::ptr_fun((int(*)(int))std::isxdigit))) > 0;
}

答案 1 :(得分:0)

int val;
scanf("%x", &val);

? (不会检查整行是否有效。)

答案 2 :(得分:0)

if(sscanf(string,“%x”,& val)!= 1)   //在这里处理你的错误