**問題
「ブランクの列を同じスペーシングを行う最小の数のタブおよびブランク
で置き換えるプログラムentabを書け。」
にとりくんでいます。
下のようにプログラムを作ってみたのですが、上手く動作しません。
間違いをご指摘いただけるとありがたいです!
lang
1#include <stdio.h> 2 3#define MAXLINE 1000 4#define TAB_STOP 8/*タブストップは8文字ごと*/ 5 6int getline(char line[],int maxline); 7void entab(char line[], char en_line[]); 8 9main() 10{ 11 char line[MAXLINE]; 12 char en_line[MAXLINE]; 13 14 while ((getline(line, MAXLINE)) > 0) { 15 entab(line, en_line); 16 printf("%s",en_line); 17 } 18 return 0; 19} 20 21int getline(char s[], int lim) 22{ 23 int c,i; 24 25 for (i = 0; i<lim-1 && (c=getchar())!=EOF && c!='\n'; i++) 26 s[i] = c; 27 if (c == '\n') { 28 s[i] = c; 29 ++i; 30 } 31 s[i] = '\0'; 32 return i; 33} 34 35void entab(char s[],char t[]) { 36 37 int i,j;/* ループカウンタ */ 38 int count;/* ブランクの数を格納する */ 39 int step;/* タブ・ストップまでのブランクの数 */ 40 int ntab;/* 置き換えるタブの数 */ 41 int nblk;/* 置き換えるブランクの数 */ 42 43 i = 0; 44 j = 0; 45 while (s[i] != '\0'){ 46 count = 0; 47 if (s[i] != ' ') { 48 t[j] = s[i]; 49 i++; 50 j++; 51 } 52 else { 53 j = i;/*はじめてブランクが見つかったところ*/ 54 while (s[i] != ' ') {/*ブランク以外の文字にあたるまで*/ 55 ++count; 56 ++i; 57 } 58 step = TAB_STOP - (j % TAB_STOP);/*タブストップまでのブランクの数を求める*/ 59 if (count < step) {/*ブランクの数よりもstepが多い*/ 60 while (0 < count) { 61 t[j] = ' ';/*ブランクをそのままコピーする*/ 62 ++j; 63 --count; 64 } 65 } 66 else 67 if (step <= count) {/*ブランクの数がstep以上*/ 68 ntab = 1 + (count -step)/TAB_STOP; 69 nblk = count - step - ntab; 70 while (0 < ntab) { 71 t[j] = '\t'; 72 ++j; 73 --ntab; 74 } 75 while (0 < nblk) { 76 t[j] = ' '; 77 ++j; 78 --nblk; 79 } 80 } 81 } 82 } 83 t[j] = '\0'; 84} 85 86
例えば
"a****bc"
という文字列が入力されたとき、
s[] 0 1 2 3| 4 5 6 7| 8
a * * * * b c
("*"はブランク、"|"はタブストップの前を表しています。簡単のためプログラムでは8文字です が4文字ごとにおいています。)
a~bまでのブランクの個数を数えて、4つあるとわかる。
タブストップまでの3つを、1つのタブに、
残りの1つを、ブランクにおきかえる。
というふうに考えてかいてみました。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/03/24 05:49
2015/03/24 15:07
2015/03/24 22:35