3

次のコードでは、16 進文字列 'a' の最初の 2 文字を読み取り、それらを sscanf で対応するバイト値に変換し、結果を 'b' に入れます。'a' には変更を加えないでください。

#include <stdio.h>
#include <string.h>

int main()
{
    unsigned char a[]="fa23456789abcdef"; // 0-9 a-f
    unsigned char b;
    unsigned int idx = 0;

    for(idx = 0; idx < 16; idx++)
        printf("%c", a[idx]); // raw dump 'a'

    printf("\n");
    sscanf(a, "%2hhx", &b); // do sscanf
    printf("%d\n", b); // check that 'b' has been correctly updated

    for(idx = 0; idx < 16; idx++)
        printf("%c", a[idx]); // raw dump 'a'... again

    return 0;
}

出力:

fa23456789abcdef
250
   3456789abcdef

コンパイラ (Code::Blocks の GNU GCC):

[...]|14|warning: pointer targets in passing argument 1 of 'sscanf' differ in signedness [-Wpointer-sign]|
[...]stdio.h|348|note: expected 'const char *' but argument is of type 'unsigned char *'|
[...]|14|warning: unknown conversion type character 'h' in format [-Wformat]|
[...]|14|warning: too many arguments for format [-Wformat-extra-args]|
||=== Build finished: 0 errors, 3 warnings (0 minutes, 0 seconds) ===|

出力では、「a」の最初の 3 文字が明確な理由もなく 3 つのヌル文字に置き換えられています。すべての警告は sscanf 行を指しています。また、code::blocks は、'b' 値が正しく更新されていても、何らかの理由で 'h' 修飾子を好まない。

期待される結果:

fa23456789abcdef
250
fa23456789abcdef

この場合、代わりに strtol を使用できますか?

4

2 に答える 2