`
carolaif
  • 浏览: 71025 次
  • 性别: Icon_minigender_2
  • 来自: 大连
最近访客 更多访客>>
社区版块
存档分类
最新评论

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

阅读更多

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'结尾。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics