1. 程式人生 > >編寫一個程式,把較長的輸入行“折”成短一些的多行,折行的位置在輸入行的第N列之前的最後一個非空格之後

編寫一個程式,把較長的輸入行“折”成短一些的多行,折行的位置在輸入行的第N列之前的最後一個非空格之後

MAXCOL是一個符號常量,它給出了輸入行的折行位置,即輸入行的第N列。整型變數pos是程式在文字行中的當前位置。程式將在輸入行的每一處第N列之前對該輸入行折行。
該程式把製表符擴充套件為空格,每遇到一個換行符就把當前的輸入文字行打印出來,每當變數pos的值達到MAXCOL時,就對輸入行進行摺疊。
函式findblnk從輸入行的pos處開始倒退著尋找一個空格,目的是為了保持折行位置的單詞的完整,如果找到一個空格符,就返回緊跟在該空格符後面的那個位置的下標,如果沒有找到空格,就範圍MAXCOL

#include <stdio.h>

#define TABINC 4
#define MAXCOL 10    //指定輸入行的折行位置
char line[MAXCOL]; /* 全域性陣列,在以下函式中都能共同訪問 */ int exptab(int pos); int findblnk(int pos); int newpos (int pos); void printl(int pos); int main() { int c, pos; pos = 0; while ((c = getchar()) != EOF) { line[pos] = c; /* 儲存當前的字元 */ if (c == '\t') pos
= exptab(pos); else if (c == '\n') { printl(pos); pos = 0; } else if(++pos >= MAXCOL) //超過限定的折行字元個數 { pos = findblnk(pos); printl (pos); pos = newpos(pos); } } } int exptab(int pos
) /* 將TAB製表符轉換為空格 */ { line[pos] = ' '; for (++pos; pos < MAXCOL && pos % TABINC != 0; ++pos) line[pos] = ' '; if (pos < MAXCOL) return pos; else { printl(pos); return 0; } } void printl (int pos) //列印該行 { int i; for (i = 0; i < pos; ++i) putchar(line[i]); if (pos > 0) putchar ('\n'); } int findblnk (int pos) /* 往前搜尋一個空格,為了保持折行位置的單詞完整性 */ { while (pos > 0 && line[pos] != ' ') --pos; if (pos == 0) //沒找到空格 return MAXCOL; else //找到空格 return pos + 1; } int newpos (int pos) //調整輸入行的位置 { int i, j; if (pos <= 0 || pos >= MAXCOL) //重置為0,開始新的折行 return 0; else { i = 0; for (j = pos; j < MAXCOL; ++j) //將剩餘的字元複製到新的折行開始處 { line[i] = line[j]; ++i; } return i; } }