P42演習1-21 ブランクの列を同じスペーシングを行う最小の数のタブおよびブランクで置き換えるプログラムentabを書け。detabと同じタブストップを使え。タブ・ストップに達するのに、タブあるいは単一のブランクのいずれかで十分なときに、どちらを使うべきか?
※detabとは演習1-20の、入力されたタブを、次のタブ・ストップまでのスペースをうめる適当な数のブランク(空白)で置き換えるプログラム
これは要するに、空白が必要な数だけ?あればタブに置き換わるようにコードを書け、と解釈したのですが、
1 2 3
と入力(数字の後ろに数字の数だけ空白)した際に、
1 2 3
となってしまいます。置き換えたタブの長さが固定なのがおかしいのだけはわかります。
以下のコードがおかしいのか、そもそも問いの解釈がおかしいのか、タブ・ストップの解釈がおかしいのか、ご指摘お願いします。
/* 空白をタブ+空白に置きかえる */
#include <stdio.h>
#define TABSTOP 4
int main(void){
int c, i;
int countspace; /* 連続する空白の数 */
int startspace; /* 連続する1以上の空白において最初の空白の文字位置 */
countspace = startspace = 0;
printf("文章を入力してください。\n");
for(i=0; (c= getchar()) != EOF; i++){
if(c == ' '){
if(countspace == 0)
startspace = i;
++countspace;
}
else{
while(0 < countspace){
/* 空白がタブで置き換わる */
if(countspace >= TABSTOP - (startspace % TABSTOP)){
putchar('\t');
countspace -= TABSTOP - (startspace % TABSTOP);
if(0 < countspace) /* まだ空白がある */
startspace += TABSTOP - (startspace % TABSTOP);
}
/* 空白がタブで置き換わらない */
else{
while(0 < countspace){
putchar(' ');
--countspace;
}
}
}
putchar(c);
}
}
return 0;
}