2010-01-11 90 views
0

我基本上试图让用户通过 getline输入十六进制输入到字符串中,因为我将对此执行其他操作。 (使用c + + .net的东西将无法正常工作)需要检查输入字符串中的十六进制值

我不想打破这个字符每说,然后通过字符串中的每个字符,看看它的范围从[0-9]或[Aa -FF。相反,我想知道是否有任何人知道的更酷的功能或更好的方法来做到这一点。我知道strtoul函数,但它返回很长时间。这将迫使我然后我想它传递给一个流,使其重新成为一个字符串。

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

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

我可以得到一个答案: 你能评论我的第二个问题吗?即使我现在不必担心它...如果我使用32位系统长时间保存一个变量....会发生什么变化(我想如此长的大小应该改变在64位处理器上)这对于保存在变量中的信息意味着什么?其次为了避免整个小/大端的东西,我把它保存在一个很长的思路中,因为它是一个注册类,它不会是一个移植问题。我错了吗?

感谢

+0

“更好” 以什么方式? – 2010-01-11 19:58:40

+0

你想/你是否愿意使用正则表达式库,例如来自Boost或TR1? – 2010-01-11 20:54:57

+0

我不明白“强制[你] ......将它传递给一个流,使它重新成为一个字符串”的一部分。如果你想坚持原始字符串,那就不要丢弃它。如果你关心64位值,那么你可以使用'strtoull'。 – jamesdlin 2010-01-11 20:56:52

回答

2

检查每个字符是唯一能够完成的句点。

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

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

通过此代码段所需要的标头是<区域设置>,<官能>,和<算法>。

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; 
} 
+0

我喜欢isxdigit函数。我做了快速功能啄 布尔inpChk(字符串inputString) { 对(INT I = 0; I djones2010 2010-01-11 20:54:09

+0

几乎有nev呃只是一种在C++中做某事的方法。 – 2010-01-11 20:55:29

+0

int(*)(int)表示一个指向一个函数的指针,该函数接受一个int并返回一个int。 – kennytm 2010-01-11 20:56:11

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

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

+0

这不会接近他所要求的。如果输入为0,它将失败。如果给它一个部分十六进制字符串,它将返回有效部分,但不会提醒他其余部分无效。 – 2010-01-11 20:42:07

+0

-1。这是一个甚至不回答这个问题的代码片段(你在调用'scanf'后做了什么?没有检查它匹配*什么*),并且'scanf'很糟糕(人们应该更喜欢使用'sscanf' ,尽管由于dauphic提到的原因,这也是一个不好的解决方案)。 – jamesdlin 2010-01-11 21:01:08

+0

我明白这并不能完全解决问题,但批评变得荒谬。 (1)如果输入为0,则不会失败。0是有效的十六进制数。 (2)喜欢在'scanf'上使用'sscanf'? 'sscanf'解析'char *','scanf'解析'stdin',你怎么能比较两者? – kennytm 2010-01-12 05:42:37

0

如果(的sscanf(字符串, “%X”,& VAL)!= 1) //处理您的错误在这里

相关问题