- ベストアンサー
ポインタから文字列を取り出す際の注意点とは?
- ポインタから文字列を取り出す際、1文字ずつ取り出す必要があります。
- 取り出した文字列は16進表記で表示されます。
- 質問文章の操作において、予想と結果が異なった理由として、3の段階で1文字しか取り出さなかったためです。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
ポインター cPtr が4バイトの領域を指している、ということは間違いないのですか? だとすれば、C言語の構文上、 *cPtr == *(cPtr + 0) == cPtr[0] ですから、 *cPtr と書くことで、cPtr が指している領域の先頭にアクセスできます。 以下同様に、 *(cPtr + n) == cPtr[n] ですから、 *(cPtr + n) または cPtr[n] と書くことで、cPtr が指している領域からnバイト分だけ離れた領域にアクセスできます(ただし、n=0~3)。
その他の回答 (4)
- asuncion
- ベストアンサー率33% (2127/6289)
>unsigned char *cPtr;で宣言していますので、 >多分これが、ポインター cPtr が指している領域の「先頭だけ」を >指しているのかなという気がしてきました。 ポインター変数を定義する際の * と、そのポインター変数が指している領域にアクセスする際の * とは、意味が別である、ということをおわかりではないようですね。
補足
情報ありがとうございます。 >そのポインター変数が指している領域にアクセスする際の 仰られるとおり、わかっていないみたいです。
- kmee
- ベストアンサー率55% (1857/3366)
wsprintf(cData,"%02X",*cPtr) の結果が(61,61,62,62)になる、ということ自体が変です。 もしかして wsprintf(cData,"%02X",*cPtr)が wsprintf(cData,"%02X %02X %02X %02X",*cPtr,*cPtr(+1),*cPtr(+2),*(cPtr+3)) みたいに、文字列分繰り返される、とか考えてないんですか?
補足
情報ありがとうございます。 >wsprintf(cData,"%02X %02X %02X %02X",*cPtr,*cPtr(+1),*cPtr(+2),*(cPtr+3)) これは思いつきませんでした。メモリ内容を1つずつ動かしているんですよね。 ちょっと解決できそうな気がします。
- asuncion
- ベストアンサー率33% (2127/6289)
>3.wsprintf(cData,"%02X",*cPtr);にて、文字列を取り出し16進表記表示で、cDataに格納します。 *cPtr と書かれていますので、ポインター cPtr が指している領域の「先頭だけ」を cData に格納していることは明らかです。
補足
情報ありがとうございます。 unsigned char *cPtr;で宣言していますので、 多分これが、ポインター cPtr が指している領域の「先頭だけ」を 指しているのかなという気がしてきました。
- wormhole
- ベストアンサー率28% (1626/5665)
>3の段階で、全文字を取り出すのではなく、1文字文(61)しか取り出さないのはなぜなのでしょうか? ⇒(61 61 62 62)が抜けませんでした。 cPtrの型がわかりませんが、1文字分だけ取り出すように書いてるからです。
補足
情報ありがとうございます。 >cPtrの型がわかりませんが、1文字分だけ取り出すように書いてるからです。 unsigned char *cPtr; の宣言をしております。 char *cPtrは、1バイト宣言なので これによって1文字分だけ取り出しているのでしょうか?
お礼
なんとなく理解することはできました。 他にも情報を集めていくことにします。 情報ありがとうございます。