演習(その3)の解答例: 問題1 - はんたいことば

文字列を一つ読み込み, それを逆順にした文字列(文字配列)を作って それを printf("%s\n",..) で出力する.

レベル 1

普通に配列と添字で解く
#include <stdio.h>

main()
{
  char word[80];
  char tmp;
  int i;
  int last;

  scanf("%s", word);		/* 文字列の読み込み */
  for(last=0; word[last] != '\0'; last++); /* 文字列終端の 0 を探す; last はその添字 */
  last--;			/* last は最後の文字の添字になる */
  i = 0;			/* i は最初の文字の添字 */
  while(i<last){
    tmp = word[i];		/* この3行で, i と last の場所の文字を交換 */
    word[i] = word[last];
    word[last] = tmp;
    i++; last--;		/* i と last の位置を一つずつ近づける */
  }
  printf("%s\n", word);
}
文字列の長さが偶数の時と奇数の時で, ループからの抜け出し方が 少し違う点に注意. 偶数の時は, 最後のペアを交換して, i と last はすれ違って last<i となる. 奇数の時は, 最後のペアを交換して, i と last はどちらも中央の文字を 指して終了となる.

レベル 2

ポインタを使って解く.
#include <stdio.h>

main()
{
  char word[80];
  char tmp;
  char *i;
  char *last;

  scanf("%s", word);		/* 文字列の読み込み */
  for(last=word; *last != '\0'; last++); /* 文字列終端の 0 を探す; last はそこへのポインタ */
  last--;			/* last は最後の文字へのポインタになる */
  i = word;			/* i は最初の文字へのポインタ */
  while(i<last){
    tmp = *i;			/* この3行で, i と last の場所の文字を交換 */
    *i = *last;
    *last = tmp;
    i++; last--;		/* i と last の位置を一つずつ近づける */
  }
  printf("%s\n", word);
}
配列+添字と, ポインタとはほとんど機械的に書き直すことが見てとれると思う.
prev index next