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