C程序设计语言(第二版) 1-16

本文介绍了一个C语言程序,该程序能够处理超出预设缓冲区大小的输入行,通过多段输入的方式找出并打印最长的文本行及其长度。

1-16 修改打印最长文本行的程序的主程序main,使之可以打印任意长度的输入行的长度,并尽可能多地打印文本。

 

#include <stdio.h>
#define MAXLINE 10
int getline(char line[], int maxline);
void copy(char to[],char from[]);
int main()
{
	char line[MAXLINE];//记录当前输入行
	char longest[MAXLINE];//记录已经输入的最长行
	char temp[MAXLINE];
	int len;//当前输入行的长度
	int max;//已输入行中的最长行的长度
	int prevmax; //记录此次输入的已输入行的长度
	int getmore;//相当于一个标记,是否超过MAXLINE
	max=0;
	prevmax =0 ;
	getmore =0;
	//如果超过了MAXLINE,是每一个MAXLINE执行一次while循环吗
	while((len = getline(line,MAXLINE))>0)
	{
		if(line[len-1]!='\n')//如果line[len-1]!='\n'
		{
			//则说明输入的字符串长度超过了MAXLINE
			if(getmore==0)
			{
				copy(temp,line);
			}
			prevmax+=len;
			if(max<prevmax)///
				max=prevmax;
			getmore=1;
		}
		else//此次输入的字符串长度比MAXLINE小
		{
			if(getmore==1){
				prevmax +=len;
				if(max<prevmax){
					max = prevmax;
					copy(longest,temp);
					longest[MAXLINE - 2] = '\n';//???????? 
				} 
				getmore=0;
			}
			else if(max<len)
			{
				max=len;
				copy(longest,line);
			}
			prevmax=0;
		}
	}
	if(max > 0) 
    { 
        printf("%s", longest); 
        printf("len = %d\n", max); 
    }
	return 0;
}

int getline(char 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';
	return i;//可以返回局部变量吗???
}
void copy(char to[], char from[])
{
	int i;
	i =0;
	while((to[i]=from[i])!='\0')
	i++;
} 

 

思路的关键在于,当一次性输入的字符串长度超过了MAXLINE时,len等于MAXLINE-1,这时候line[len-1]!='\0',否则line[len-1]=='\0'。 原因,字符串在内存中存放时是以'\0'结尾。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值