Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 难道溪流不尊重基地吗?_C++_Base_Istream - Fatal编程技术网

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);