次のコードでは、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 を使用できますか?