演習1-22 長い入力行を、入力のn字文字目までにある最後の非ブランク文字の後で、”折りたたむ”プログラムを書け。プログラムは、行が非常に長くても、また指定桁までにブランクもタブもない場合についても、ちゃんと動作するようにせよ。
において、
例えばabcd ~ xyz\nEOFとアルファベットを全て入力すると、
abcdefghijklmnopqrs-
tu
までしか出力されません。
34行目のif文が1度までは正しく実行されるのですが以降おかしい。
50行目以降の記述が怪しいのですが何がおかしいかまではわかりません。
誤っている箇所と訂正内容のご指摘願えないでしょうか?
/* n(今回は20)文字までにある空白以外の文字の後で折りたたむ */
/* ※行が非常に長い or n文字までに空白が1つもなくても動作するよう */
/* ※タブは長さがわからないので無視する */
#include <stdio.h>
#define MAXLINE 1000
#define MAXLENGTH 21 /* 21文字までに必ず改行*/
int main(void){
int c, i;
int colspace; /* 空白が入力される度に空白の文字位置を格納 */
int len;
char buf[MAXLINE];
char word[MAXLINE];
len = 0;
colspace = -1;
printf("文章を入力してください。\n");
printf("1行の長さが%d文字以上にはなりません。\n", MAXLENGTH-1);
for(i=0; ; i++){
c = getchar();
if(c == ' '){
colspace = i;
buf[i] = c;
}
else if(c == '\t'){
--i;
continue;
}
else
buf[i] = c;
if(i == MAXLENGTH -1 || c == '\n'){ /* このif文に入るまで入力を繰り返す */
if(c == '\n') /* 21文字までに改行の入力がある */
buf[i+1] = '\0';
else if(0 <= colspace && colspace < MAXLENGTH){ /* 21文字までに空白があり、改行の入力がない */
buf[colspace] = '\n';
buf[MAXLENGTH+1] = '\0';
}
else if(colspace == -1){ /* 21文字までに一度も空白がなく、改行の入力がない */
buf[i+2] = buf[i];
buf[i+1] = buf[i-1];
buf[i] = '\n';
buf[i-1] = '-';
buf[i+3] = '\0';
}
for(i=0; buf[i] != '\0'; i++)
word[i + len] = buf[i];
if(MAXLINE < i+len){
printf("文章が長すぎます。%f文字以上は入力しないでください。\n", MAXLINE+1);
return 1;
}
len += i;
colspace = -1;
for(i=0; buf[i] != '\0'; i++)
buf[i] = '\0';
i = 0;
}
if(c == EOF){
word[len] = '\0';
break;
}
}
printf("12345678901234567890\n");
printf("%s", word);
return 0;
}