/* 把较长的输入行折成短一些的两行或多行,折行的位置在输入行的第n列之前的最后一个
非空格之后.要保证程序能够智能地处理输入行很长以及在指定的列前没有空格或
制表符时情况 */
#include<stdio.h>
#define stopbit 8 /* 制表符终止位 */
#define MAXSIZE 120 /* 行上限 */
#define MAXLINE 1010 /* 允许的输入行的最大长度1000 */
typedef signed char int8_t;
static void changeline(int8_t s[]);
static int getline(int8_t s[], int lim);
int main(void)
{
int8_t line[MAXLINE] = { 0 };//当前的输入行
int i = 0;
int len;
freopen("C:\\\\Users\\wwwzh\\Desktop\\data.in", "r", stdin);
freopen("C:\\\\Users\\wwwzh\\Desktop\\data.out", "w", stdout);
while ((len = getline(line, MAXLINE)) > 0)
{
if (len >= MAXSIZE)
changeline(line);
printf("%s", line);
}
return 0;
}
extern int detab(char s[]);
/* getline函数: 将一行读入到s中并返回其长度
遇到EOF返回0,每一行至少包含一个字符,只包含换行符的行,其长度为1 */
static int getline(int8_t s[], int lim)
{
int c, i;
for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; i++)
s[i] = c;
if (c == '\n')
{
s[i] = c;
i++;
}
s[i] = '\0';
detab(s);
i = 0;
while (s[i] != '\0')i++;
return i;
}
/* 把较长的输入行折成短一些的两行或多行,折行的位置在输入行的第n列之前的最后一个
非空格之后 */
static void changeline(int8_t s[])
{
//第一步,把s弄到一个二维数组
int8_t array[8][MAXSIZE] = { 0 };
int i = 0, j = 0, k = 0;
while (s[k] != '\0')
{
if (j == MAXSIZE - 1)
{
array[i][j] = '\n';
j = 0;
i++;
}
array[i][j] = s[k];
j++;
k++;
}
//第二步,把各数组结尾的空格赋值为-1
while (i >= 0)
{
j = MAXSIZE - 2;
while (array[i][j] == ' ')
{
array[i][j] = -1;
j--;
}
i--;
}
//第三步,除-1外二维数组所有都拼接到s
i = j = k = 0;
while (array[i][j] != 0)
{
if (array[i][j] != -1)
{
s[k] = array[i][j];
k++;
}
j++;
if (j == MAXSIZE)
{
i++;
j = 0;
}
}
s[k] = '\0';
}