c程序设计语言(第二版.新版)习题1_22

/* 把较长的输入行折成短一些的两行或多行,折行的位置在输入行的第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';
}

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值