- ベストアンサー
printf("%x", str)
#include <iostream.h> main(){ char a[] = "02"; char b[] = "20"; printf("%#x %#x", a, b); } 結果 → 0x64fe01 0x64fdfe もし結果が 0x30,0x32 0x32,0x30 という感じなら分かるのに 02 がどうして 64fe01 なんですか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>02 がどうして 64fe01 なんですか? 恐らく、変数a,bのアドレスが表示されていると思います。 %xは与えられた変数の値を16進表示するのでaと書いてprintf渡すと、変数aは配列ですので、aと書けばそのポインタの値(=メモリアドレス)がprintfに渡されることになります。 中身を表示したいのであれば、 printf("%#x %#x", *a, *b); と書けばうまくいくはずです。
その他の回答 (2)
文字列を受け付けるのは %s だけです。 なので、文字列を 0x30 0x32 と表示するのでしたら、ループなどにするしかないです。 char *p; for (p = a; *p; p++) { printf("%#x ", *p); }
お礼
0x30 0x32 と表示させることもできました。 #include <iostream.h> main(){ char a[] = "02"; char *p; for (p = a; *p; p++) { printf("%#x ", *p); } }
- JunkMaster
- ベストアンサー率21% (23/106)
「char a[]」は、「char *a」と同じくポインタ変数の定義です。 実際に領域を確保するわけではありません。 従いまして、char a[] = "02"; では、先頭の"0"のアドレスがaに代入されます。この結果は、ポインタ型変数a,bのアドレスを表示したにすぎません。
お礼
ありがとうございます。 表示されていたのはアドレスだったと分かりました。 #include <iostream.h> main(){ char a[] = "02"; char b[] = "20"; cout << &a << '\n'; cout << &b << '\n'; printf("%#x %#x", a, b); }
お礼
cout では a で 02 が表示されるのに、 printf( ) の場合は a だとアドレスになるから printf( ) の場合は *a にしないと値が得られないんですね。