• ベストアンサー

ポインターについて

配列nにAからZまでの文字型が格納されている状態で、ポインタ変数を2つ使って配列n1に逆順に格納するプログラムを作っているのですがどうもうまくいきません。良ければアドバイスください。お願いします。 こんな感じです。・・・は省略。 n = A・・・z n1=Z・・・A

質問者が選んだベストアンサー

  • ベストアンサー
  • unchikun
  • ベストアンサー率22% (2/9)
回答No.1

即席+スマートではないですが、こんな感じです。 #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 を参考にしつつ、配列を紙に書きながらプログラミングするとみえてくると思います。

imarusu
質問者

お礼

長々と書いていただきありがとうございます。 この通りにやってみます。

その他の回答 (2)

  • ddnp009
  • ベストアンサー率25% (15/58)
回答No.3

>ポインタ変数を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'; ※結果の出力やリソースの解放については省略

imarusu
質問者

お礼

ポインターの配置位置など詳しく書いていただきありがとうございます。 このやり方でもやってみたいと思います。

回答No.2

#1の補足。 malloc()したら、free()するのをお忘れなく。

関連するQ&A

専門家に質問してみよう