編寫一個程式,把較長的輸入行“折”成短一些的多行,折行的位置在輸入行的第N列之前的最後一個非空格之後
阿新 • • 發佈:2019-01-31
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;
}
}