私は現在コードを設計しており、与えられた指示の1つは、16進文字列の最初の2桁を取得して、目的の操作を実行することです。A未満のすべてが考慮されます。それより大きいものはそうではありません、それはただ次の数を取ります。これはコードを台無しにします。
これを変換する行は次のとおりです。
int x = atoi(hex.c_str);
私は何が間違っているのですか?
私は現在コードを設計しており、与えられた指示の1つは、16進文字列の最初の2桁を取得して、目的の操作を実行することです。A未満のすべてが考慮されます。それより大きいものはそうではありません、それはただ次の数を取ります。これはコードを台無しにします。
これを変換する行は次のとおりです。
int x = atoi(hex.c_str);
私は何が間違っているのですか?
これがあなたの意図したことだと思います-文字列の最初の2桁の16進数のみを符号なし整数に変換したいと思います。また、文字列には有効な16進数のみが含まれていると想定しています。文字列を検証する場合は、そのための追加のコードを作成する必要があります。
strtoul
代わりに、16進文字列を符号なし整数に変換するために使用します。またsubstr()
、文字列クラスのメソッドを使用して、16進文字列の最初の2桁のみを抽出します。
#include <string>
#include <cstdio>
#include <cstdlib>
int main()
{
std::string myhex = "abcdef";
unsigned int x = strtoul(myhex.substr(0, 2).c_str(), NULL, 16);
printf("x = %d\n", x);
}
これはあなたの出力になります(すなわち0xab = 171
):
x = 171
int x = strtol(hex.c_str(), NULL, 16);
sscanf
文字列の一部を読み取りたい場合にも使用できます。あなたは最初の2文字だけを取りたいと言った:
int x;
if( 1 == sscanf(hex.c_str(), "%2x", &x) ) {
printf( "Value is: %d\n", x );
} else {
printf( "Conversion failed\n" );
}
上記は実際にはC++ではないことに注意してください。std::hex
そのためにストリーム修飾子を使用できますmystr
(混乱を避けるために、今回は文字列を呼び出したことに注意してください(特に名前空間をインポートした場合std
):
int x;
std::istringstream iss(mystr);
bool ok = (iss >> std::hex >> x);
[編集]あなたのコメントで、符号なし整数への変換について質問されていることに気づきました。その場合、なぜ整数を明示的に宣言しないのunsigned int
ですか?
unsignedの場合は、を使用する必要がありますstrtoul
。
atoi
関数には10進数が必要です
代わりに、例えばを使用してくださいstrtol
通常、ドキュメントを読むことをお勧めします。関数の名前をAltaVista(または、さらに言えば、google)に書き込むだけです。そしてそれはあなたのためのいくつかのドキュメントを見つけるでしょう
符号なしに変換する場合は、おそらくstrtoul
接頭辞を16に設定0x
するか、基数を16に設定して使用することをお勧めします。これstrtol
も正しく機能する可能性がありますが、符号付きの値が得られるはずなので、少なくとも一部のコンパイラから、符号付きと符号なしの混合について警告が表示される場合があります。