スペースをタブに変換する

/*---------------------------------------------------------------
		スペースをタブに変換する
----------------------------------------------------------------*/
#include <stdio.h>

#define	NASHI	0	/* tab_flag 未出力' 'なし*/
#define	ARI	1	/* tab_flag 未出力' 'あり*/

void main()
{
	char	a[80];			/*変換する文字列*/
	char	b[80];			/*結果を格納する配列*/
	int	i=-1, j=0;		/*配列の添え字*/
	int	st;			/*' 'スタート位置*/
	int	tab_width;		/*タブ幅*/
	int	next_tab;		/*次のタブ位置*/
	int	tab_flag;		/*未出力' 'の有無*/
	
	/*変換する文字列の入力*/
	printf("input stings : ");
	gets(a);
	
	/*タブ幅の入力*/
	printf("tab width : ");
	scanf("%d", &tab_width);
	
	/*変換処理*/
	tab_flag = NASHI;
	do {
		i++;
		/*タブ位置まで' 'がたまっている時*/
		if (tab_flag == ARI && i == next_tab) {
			b[j++] = '\t';
			tab_flag = NASHI;
		}
		
		/*' 'がたまっていない時*/
		if (tab_flag == NASHI) {
			if (a[i] != ' ') b[j++] = a[i];
			else {
				/*' 'をためはじめる*/
				tab_flag = ARI;
				st = i;
				next_tab = (i / tab_width + 1) * tab_width;
			}
		}
		
		/*' 'がたまっている時*/
		else {
			if (a[i] != ' ') {
				/*すべてコピー*/
				for (; st <= i; st++) b[j++] = a[st];
				tab_flag = NASHI;
			}
		}
	} while (a[i] != '\0');
	
	/*結果の表示*/
	printf("a[] = %s\n", a);
	printf("a[] = ");
	for (i=0; a[i] != '\0'; i++) printf("%2.2X ", a[i]);
	printf("%2.2X\n", a[i]);
	
	printf("b[] = %s\n", b);
	printf("b[] = ");
	for (j = 0; b[j] != '\0'; j++) printf("%2.2X ", b[j]);
	printf("%2.2X\n", b[j]);
}


実行結果

D:\cp>oyo1-6-1
input stings :       abc       123
tab width : 4
a[] =       abc       123
a[] = 20 20 20 20 20 20 61 62 63 20 20 20 20 20 20 20 31 32 33 00
b[] =     abc           123
b[] = 09 20 20 61 62 63 09 09 31 32 33 00