C++ 难道溪流不尊重基地吗?
由于使用了C++ 难道溪流不尊重基地吗?,c++,base,istream,C++,Base,Istream,由于使用了atoi和atof,我正在尝试修正一些关于受污染值的覆盖率发现。我切换到了一个istringstream,但它不会产生10个基数以外的预期结果 如果我切换到基16,输入0xa并避免使用iss.ignore(2),则结果为0: $ ./tt.exe 0xa X: 0 如果我切换到基16,输入0xa并使用iss.ignore(2),则结果为异常: $ ./tt.exe 0xa '0xa' is not a value 我按照@πάντα的建议进行了访问,但没有讨论这方面的限制 你知道我
atoi
和atof
,我正在尝试修正一些关于受污染值的覆盖率发现。我切换到了一个istringstream
,但它不会产生10个基数以外的预期结果
如果我切换到基16,输入0xa并避免使用iss.ignore(2)代码>,则结果为0:
$ ./tt.exe 0xa
X: 0
如果我切换到基16,输入0xa并使用iss.ignore(2)代码>,则结果为异常:
$ ./tt.exe 0xa
'0xa' is not a value
我按照@πάντα的建议进行了访问,但没有讨论这方面的限制
你知道我做错了什么吗?或者,我怎样才能让它按预期工作
$cat tt.cxx
#包括
#包括
#包括
#包括
使用名称空间std;
模板
T StringToValue(常量std::string和str){
标准:istringstream iss(str);
T值;
如果(str.length()>=2){
如果(str[0]='0'&&(str[1]='X'| | str[1]='X'))
{
iss.setf(标准::ios_base::十六进制);
忽略(2);
}
}
iss>>价值;
if(iss.fail())
抛出运行时_错误(““+str+””不是值);
返回值;
}
int main(int argc,char*argv[])
{
尝试
{
INTX=StringToValue(argc>=2?argv[1]:“ZZZ…”);
cout你想得太多了。用十六进制表示法读取一个值很容易
#include <sstream>
#include <iomanip>
#include <cassert>
int main()
{
{
int x = 0;
std::istringstream is("0xa");
is >> std::hex >> x;
assert(x == 10);
}
{
int x = 0;
std::istringstream is("a");
is >> std::hex >> x;
assert(x == 10);
}
}
这就是为什么iss>>std::hex
要容易得多的原因
这也是为什么在发布之前,您应该构建一个最小的测试用例,它只包含对iss.setf
的测试
2.逻辑错误
输入仅为“a”的情况完全跳过该语句,因为它以前两个字符为“0x”为条件
我会将其移动到iss>>值之前
您可以看到您的固定代码,但是,正如我在回答的开始部分所探讨的,打开前导-“0x”
的整个过程是不必要的,因此您的大部分代码都可以删除。您完全想得太多了。读取十六进制表示法的值很容易
#include <sstream>
#include <iomanip>
#include <cassert>
int main()
{
{
int x = 0;
std::istringstream is("0xa");
is >> std::hex >> x;
assert(x == 10);
}
{
int x = 0;
std::istringstream is("a");
is >> std::hex >> x;
assert(x == 10);
}
}
这就是为什么iss>>std::hex
要容易得多的原因
这也是为什么在发布之前,您应该构建一个最小的测试用例,它只包含对iss.setf
的测试
2.逻辑错误
输入仅为“a”的情况完全跳过该语句,因为它以前两个字符为“0x”为条件
我会将其移动到iss>>值之前
你可以看到你的固定代码,但是,正如我在回答的开始部分所探讨的那样,整个打开前导-“0x”
的操作是不必要的,所以你的大部分代码都可以被删除。在读取数字时去掉0x
前缀。啊,我明白了,你已经把忽略(2)
在那里。通常的方法是类似于iss>>hex>>value;
你能做一个最小的测试用例吗?@user1034749-我们支持古老的编译器。事实上,我刚刚用GCC 3.2在Fedora 1上完成了测试。(我们不像浏览器和苹果操作系统)。在读取数字时去掉0x
前缀。啊,我知道了,你已经把ignore(2)
放在那里了。通常的方法是iss>>hex>>值;
。你能做一个最小的测试用例吗?@user1034749-我们支持古老的编译器。事实上,我刚刚用GCC 3.2在Fedora 1上完成了测试。(我们不喜欢浏览器和苹果操作系统)。谢谢。你知道为什么显式设置基没有按预期工作吗?这可能会在将来对我有所帮助。@jww:我没有研究它。现在我已经用一个最小的测试用例证明了istringstream
工作得很好,你可以继续调试以找出答案。:)它看起来也可能对其他人有帮助:。再次感谢。你知道为什么显式设置基不能像预期的那样工作吗?这可能在将来对我有帮助。@jww:我没有研究它。现在我已经用一个最小的测试用例证明了istringstream
工作得很好,你可以继续调试以找出答案。:)看起来像这样可能也会帮助其他人:。再次感谢。
iss.setf(std::ios_base::hex, std::ios::basefield);