我正在研究工作中的代码。我有以下代码。在下面的代码中,最后一个语句的含义是什么?
bOptMask = true;
std::string strMask;
strMask.append(optarg);
std::stringstream(strMask) >> std::hex >> iMask >> std::dec;
除了上面的问题:我有字符串输入,我需要知道如何使用上面的C ++流将其转换为整数,而不是atoi()
。
我面临的问题是如果我提供输入
strOutput.append(optarg);
cout << "Received option for optarg is " << optarg << endl;
std::stringstream(strOutput) >> m_ivalue ;
cout << "Received option for value is " << m_ivalue << endl;
对于上面的代码,如果我使用参数“a”运行,我输出的第一行为“a”,第二行输出为0.我不知道为什么,任何人都可以解释?
答案 0 :(得分:2)
代码采用字符串optarg
,并将其视为十六进制,将其转换为整数并将其存储在iMask中。
如果删除std :: hex修饰符,则可以将输入解析为十进制。但是,我通常会使用boost的lexical_cast。例如:
int iMask = boost::lexical_cast< int >( strMask );
答案 1 :(得分:2)
最后一个语句创建一个临时字符串流,然后用它将字符串解析为十六进制格式到iMask中。
但是它存在缺陷,因为没有办法检查流式传输是否成功,最后一个流没有实现,因为你处理的是暂时的。
最好将stringstream创建为非临时的,理想情况下使用istringstream,因为您只使用它将字符串解析为int,然后检查转换是否成功。
std::istringstream iss( strMask );
iss >> std::hex;
if(!( iss >> iMask ))
{
// handle the error
}
如果你的字符串流现在要解析一个十进制整数,你只需要将模式设置回十进制。如果它要解析更多的十六进制文件,你也可以阅读它们,例如,如果你有一堆文件。
您如何处理错误取决于您。
std::hex
和std::dec
是流<iomanip>
部分的一部分,用于指示文本的格式化方式。 hex表示“十六进制”,dec表示“十进制”。默认情况下,对于整数使用十进制,对指针使用十六进制。由于我不知道的原因,没有用于打印float或double的十六进制表示,即没有“十六进制点”,尽管C99排序支持它。
答案 2 :(得分:1)
此代码使用manipulators设置流以期望在基数16(十六进制,使用数字0123456789ABCDEF)中读取整数,然后从字符串中提取十六进制数,将其存储在iMask中,并使用另一个操纵器将字符串流设置回默认的期望整数,以十进制形式写入。