Cプログラミング言語(第2版)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]!='
')// line[len-1]!='
' { // 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] = '
';//???????? } getmore=0; } else if(max<len) { max=len; copy(longest,line); } prevmax=0; } } if(max > 0) { printf("%s", longest); printf("len = %d
", max); } return 0; } int getline(char s[],int lim) { int c,i; for(i=0;i<lim-1 && ((c=getchar())!=EOF && c!='
'); ++i) s[i] = c; if(c == '
') //?? { 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'で終わるからです.