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」、2番目の行が0の出力があります。理由はわかりませんが、誰か説明できますか?

4

3 に答える 3

3

最後のステートメントは一時的な文字列ストリームを作成し、それを使用して文字列を16進形式としてiMaskに解析します。

ただし、ストリーミングが成功したことを確認する方法がなく、一時的な処理を行っているため、最後のストリームでは何も達成されないため、欠陥があります。

文字列ストリームを非一時的なものとして作成することをお勧めします。理想的には、文字列をintに解析するためにのみ使用するため、istringstreamを使用して、変換が成功するかどうかを確認します。

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

文字列ストリームが10進整数を解析しようとしている場合にのみ、モードを10進に戻す必要があります。より多くの16進数を解析する場合、たとえばファイルから多数の16進数がある場合は、それらも読み取ることができます。

エラーをどのように処理するかはあなた次第です。

std::hexおよびstd::dec<iomanip>、テキストのフォーマット方法を示すストリームの一部です。hexは「16進数」を意味し、decは「10進数」を意味します。デフォルトでは、整数には10進数を使用し、ポインターには16進数を使用します。私にはわからない理由で、floatまたはdoubleを印刷するための16進表現などはありません。つまり、C99の種類ではサポートされていますが、「16進ポイント」はありません。

于 2011-02-25T13:42:25.107 に答える
2

コードは文字列optargを受け取り、それを16進数として扱い、整数に変換してiMaskに格納します。

std :: hex修飾子を削除すると、入力を10進数として解析できます。ただし、これには通常、boostのlexical_castを使用します。例えば:

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

このコードは、マニピュレータを使用して、整数が基数16で読み取られることを期待するようにストリームを設定し(16進数、数字0123456789ABCDEFを使用)、文字列から16進数を抽出して、iMaskに格納し、別のマニピュレータを使用して文字列ストリームを元に戻します。整数が10進形式で書き込まれることを期待するデフォルトに。

于 2011-02-25T13:46:24.357 に答える