将包含整数的字符串与包含十六进制的字符串进行比较的最简单方法
Posted
技术标签:
【中文标题】将包含整数的字符串与包含十六进制的字符串进行比较的最简单方法【英文标题】:The easiest way to compare string containing integer to string containing hex 【发布时间】:2013-03-16 11:59:56 【问题描述】:我有两个字符串,一个是整数(例如字符串 strInt = "100"),一个是十六进制数字(例如字符串 strHex = "0x64")。 如果 strInt 和 strHex 的值相等(数字),比较最快/最好/安全的方法是什么?
需要排除 sprintf 以防止缓冲区溢出 也不能使用 snprintf - 我的编译器不支持 c++ 11
提前谢谢大家
【问题讨论】:
这里的关键信息是位数,你把它漏掉了 当然这需要在 C++ 中完成 :) 十六进制格式为 0xyyyyy - 所以 5 个数字 那个十六进制数不也是整数吗?你的意思是“十进制”吗? 【参考方案1】:使用strtol
将两者都转换为整数,然后进行比较。您可以使用strHex.c_str()
将c++字符串转换为strtol
所需的c风格字符串。
例子:
long int numHex = strtol(strHex.c_str(),NULL,16); // 16 is the base of the source
long int numInt = strtol(strInt.c_str(),NULL,10);
【讨论】:
【参考方案2】:我看不出这需要sprintf()
或snprintf()
函数。
std::string a = "1337";
std::string b = "0x539";
std::stringstream as;
as.str(a);
std::stringstream bs;
bs.str(b);
int na, nb;
as >> na;
bs >> std::hex >> nb;
std::cout << a << " is " << (na == nb ? "equal" : "not equal") << " to " << b << std::endl;
【讨论】:
我正在考虑这样做 - 但这是最优的吗?似乎需要大量内存来创建两个字符串流只是为了比较两个数字??? @marcin 看看建议使用strtol()
的答案很快就会被大量否决:P 如果你有一个好的优化编译器,这应该不是问题,并且通常使用 C++ 代码当你用 C++ 写东西时,更喜欢使用 C。
@H2CO3 想解释一下为什么? (老实说,我不知道,否则不会建议)
@H2CO3 不太相信使用 stringstream 而不是 strtol... 但毕竟这似乎是一个更安全的选择
@H2CO3:在这种情况下,安全选项是strtol
。在 C++11 中,这就是流内部使用的内容。在 C++03 中,他们改为使用 fscanf 系列,在某些情况下使用 Undefined Behavior,特别是从十六进制转换......所以,在这种情况下,使用更高级别功能的一般准则,导致选择明显劣质的解决方案:更不安全、更低效、更冗长。 :-) 只有在节省工作时才使用更高级别的解决方案。以上是关于将包含整数的字符串与包含十六进制的字符串进行比较的最简单方法的主要内容,如果未能解决你的问题,请参考以下文章