- ベストアンサー
ポインターについて
配列nにAからZまでの文字型が格納されている状態で、ポインタ変数を2つ使って配列n1に逆順に格納するプログラムを作っているのですがどうもうまくいきません。良ければアドバイスください。お願いします。 こんな感じです。・・・は省略。 n = A・・・z n1=Z・・・A
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
即席+スマートではないですが、こんな感じです。 #include <stdio.h> #include <string.h> int main() { char n[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //この場合末尾の'\0'も自動で確保される点に注意 char *n1; char *p, *q; int len = strlen(n); // strlenは末尾の"\0"はカウントしない点に注意 // n[]と同じサイズの領域を確保 (+1しているのは文字終端の'\0'文字を確保するため) n1 = (char *) malloc(sizeof(char)*len + 1); // 確保した領域をとりあえず'\0'で埋める memset(n1, '\0', sizeof(char)*len+1); // pは配列nの先頭、qは配列n1の最後から2番目(末尾は'\0'保持用)を指すように初期化。 // qを後ろから前にずらし、pは前から後ろにずらしながら内容をコピーしていく // pが文字の終端 '\0' についたらループ終了 for (p=n, q=n1+len-1; *p!='\0'; p++, q--) *q = *p; printf("n : %s\n", n); printf("n1: %s\n", n1); return 0; } 注意しべき点は、 char n[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; と初期化した場合は自動で末尾に'\0'が付加される点です。 つまり配列nのサイズは26+1=27になります。 よって格納する配列のサイズも27にしなければいけませんし、コピーした後の末尾の'\0'を忘れてはいけません。 上ではn1の領域をmallocで動的に確保し、確保した領域を'\0'で埋めてから文字を先頭からコピーしているので終端の'\0'は残ります。 明示的に末尾に n1[26] = '\0' と代入してももちろんよいです。 http://www.pc.uec.ac.jp/sp/hshrkw/edu/program/b1/exercise/exercise1-10.html http://homepage3.nifty.com/mmgames/c_guide/14-02.html を参考にしつつ、配列を紙に書きながらプログラミングするとみえてくると思います。
その他の回答 (2)
- ddnp009
- ベストアンサー率25% (15/58)
>ポインタ変数を2つ どの用途として2つ要るのか分からんけど、 とりあえず次のようにしてみる? 出力先先頭アドレスと、ループ内の出力先。 char n[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; size_t length = strlen(n); char *n1 = (char*)malloc(length + 1); /* ポインタ1個目 */ char *here = n1; /* ポインタ2個目 */ while (length--) *here++ = *(n + length); *here = '\0'; ※結果の出力やリソースの解放については省略
お礼
ポインターの配置位置など詳しく書いていただきありがとうございます。 このやり方でもやってみたいと思います。
- charmer29-2
- ベストアンサー率25% (41/159)
#1の補足。 malloc()したら、free()するのをお忘れなく。
お礼
長々と書いていただきありがとうございます。 この通りにやってみます。