演習(その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