1-22 fold.c
汚い! 汚いよこれ!
clear_buffer()はせめてマクロにしたかった…
/* * P42 演習1-22 * 長い入力行を、入力のn文字目までにある最後の非ブランク文字の後で、 * "折りたたむ"プログラムを書け。プログラムは、行が非常に長くても、また * 指定桁までにブランクもタブもない場合についても、 * ちゃんと動作するようにせよ。 * * 2007/06/23 arikui */ #include <stdio.h> #define FOLD_WIDTH 50 #define TAB_STOP 4 void clear_buffer(char *buffer, int *buff_ptr_ptr){ buffer[0] = '\0'; *buff_ptr_ptr = 0; } int main(void){ int n = FOLD_WIDTH, tab = TAB_STOP, col = 0; char buff[FOLD_WIDTH + 1] = {'\0'}; int buff_ptr = 0; int c; while((c = getchar()) != EOF){ if (c == ' ' || c == '\t'){ if (col < n){ col += ((c == '\t') ? tab - col % tab : 1); /* pool at buff */ buff[buff_ptr++] = c; buff[buff_ptr] = '\0'; }else{ putchar('\n'); clear_buffer(buff, &buff_ptr); } }else{ if (col < n){ printf("%s", buff); /* flush buffer */ clear_buffer(buff, &buff_ptr); if (c == '\n') col = 0; else ++col; putchar(c); }else{ putchar('\n'); col = 0; putchar(c); clear_buffer(buff, &buff_ptr); } } } return 0; }