4

これが私のコードのはるかに短いバージョンです:

char token[256];
unsigned int maskval = 0;

//Token gets read in here.

printf("token: %s\n", token);

if (sscanf(token + 2, "%x", &maskval) == 1) {
     //do stuff
} else {
     printf("error: %d, %x\n", maskval, maskval);
}

ご覧のとおり、16進文字列を関数に渡し、それらをトークンに読み取り、sscanf()を使用して16進値の文字列バージョンをunsignedintに変換しています。文字列トークンは、常に「0x」、「0X」、「Ox」、または「OX」で始まります。これは、ユーザーが値を入力するときに0とOの違いがわからないためです(viは同じグラフィックを表示します)。「0x00EE」を渡すと、次のようになります。

token: 0x00EE
error: 0

私が信じている問題は、「0x00EE」または「OxOOEE」(ゼロ対大文字のo)の線に沿って何かを渡すかどうかです。どちらもviで同じように見えますが、このシナリオで異なる方法で処理されるかどうかはわかりません。うまくいけば、私は見落としていた本当に単純で愚かなことをしているだけです(通常はそうです)。また、使ってみました

maskval = strtol(token, NULL, 16);

sscanf()の代わりに、まったく同じ結果が得られます。

何か案は?

4

1 に答える 1

6

ここに1つの間違いがあります:

char *token[256];

これは、文字の配列ではなく、文字()への256個のポインターchar *の配列です。

あなたが意味した:

char token[256];

これからコンパイラの警告がたくさんあるはずです。

有効な16進数ではないもので始まる文字列から16進値を解析しようとすると、もちろん、との両方sscanf()で失敗しstrtoul()ます。'O'数字の0のように見えるという理由だけで、標準関数を16進数と見なす必要があると思われるように聞こえます。それは...彼らがどのように設計されたかではなく、幸運だと思います。:)フォントの変更を検討することをお勧めします。

不適合のプレフィックスを手動で削除できます。常に2文字のプレフィックスがあり、それ1つあると仮定すると、次のようになります。

const char *number = token + 2;

while(!isxdigit(*number))
  number++;
/* Now number will point at the first hexadecimal
   digit in token, or '\0' if none were found.
*/
if(sscanf(number, "%x", &maskval) == 1)
  printf("success, got %x\n", maskval);
else
  printf("failed to parse '%s' as hexadecimal number\n", number);
于 2012-04-18T14:01:46.173 に答える