4

我正在研究工作中的代码。我有以下代码。在下面的代码中,最后一条语句的含义是什么?

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。我不知道为什么,谁能解释一下?

4

3 回答 3

3

最后一条语句创建一个临时字符串流,然后使用它将十六进制格式的字符串解析为 iMask。

但它也有缺陷,因为无法检查流式传输是否成功,并且在处理临时流时,最后一个流没有任何效果。

最好将 stringstream 创建为非临时的,理想情况下使用 istringstream,因为您仅使用它来将 string 解析为 int,然后检查转换是否成功。

std::istringstream iss( strMask );
iss >> std::hex;
if(!( iss >> iMask ))
{
 // handle the error
}

如果您的字符串流现在要解析十进制整数,则只需将模式设置回十进制。如果它要解析更多的十六进制,你也可以读取它们,例如,如果你从一个文件中有一堆它们。

如何处理错误取决于您。

std::hex并且std::dec<iomanip>流的一部分,指示文本应该被格式化的方式。hex 表示“十六进制”,dec 表示“十进制”。默认值是对整数使用十进制,对指针使用十六进制。由于我不知道的原因,没有用于打印浮点或双精度的十六进制表示,即没有“十六进制点”,尽管 C99 支持它。

于 2011-02-25T13:42:25.107 回答
2

代码获取字符串optarg并将其视为十六进制,将其转换为整数并将其存储在 iMask 中。

如果您删除 std::hex 修饰符,您可以将输入解析为十进制。但是,我通常为此使用 boost 的 lexical_cast。例如:

int iMask = boost::lexical_cast< int >( strMask );
于 2011-02-25T13:40:45.840 回答
1

此代码使用操纵器将流设置为期望以基数 16 读取整数(十六进制,使用数字 0123456789ABCDEF),然后从字符串中提取十六进制数,将其存储在 iMask 中,并使用另一个操纵器将字符串流设置回期望整数以十进制形式写入的默认值。

于 2011-02-25T13:46:24.357 回答