演習(その3)の解答例: 問題3 - 文字列の分割

入力として, 0個以上の「/」を含む文字列を受け取り, それを区切りとして分解して複数の文字列とし, それらを番号をつけて printf("%d %s\n",..) で出力するプログラムを作成する.

レベル 1

分解してできた文字列を, 番号の昇順(0,1,2,...)に出力するプログラム.
#include <stdio.h>

main()
{
  char str[80];
  int i;			/* 文字列を順次たどるための添字 */
  int iw;			/* 区切ってできた部分文字列の番号 */
  int start;			/* 今できつつある部分文字列の先頭添字 */

  scanf("%s", str);
  iw = 0;
  start = 0;
  for(i=0; str[i] != '\0'; i++){ /* 文字列を一字ずつたどって */
    if(str[i] == '/'){		/* 区切りの文字だったら */
      str[i] = '\0';		/* そこで文字列を区切って */
      printf("%d %s\n", iw, str+start);	/* そこまでの部分文字列を出力 */
      iw++;			/* 番号をインクリメント */
      start = i+1;		/* 次の部分文字列の先頭添字をおぼえておく  */
    }
  }
  printf("%d %s\n", iw, str+start); /* 最後の部分文字列を出力 */
}

レベル 2

分解してできた文字列を, 番号の逆順(...,2,1,0)に出力するプログラム.
#include <stdio.h>

main()
{
  char str[80];
  int word_indexes[10];		/* 部分文字列の先頭位置を記録する */
  int i;
  int iw;			/* 部分文字列の番号 */

  scanf("%s", str);
  word_indexes[0] = 0;		/* 第一の部分文字列の先頭は 0 */
  iw = 1;
  for(i=0; str[i] != '\0'; i++){ /* 文字列をたどる */
    if(str[i] == '/'){		/* 区切りの文字だったら */
      str[i] = '\0';		/* 区切って */
      word_indexes[iw] = i+1;	/* 次の先頭位置を覚えておく */
      iw++;
    }
  }

  for(i=iw-1; i>=0; i--){	/* 逆順に先頭位置をたどって */
    printf("%d %s\n", i, str+word_indexes[i]); /* 出力 */
  }
}

prev index