user-0 提问: 菜鸟求助~C程序设计课后题1-16

回复:
user: user-1
content: 引用 楼主 runheartt 的回复:最近看《C程序设计语言》 遇到习题1-16 : 修改打印最长文本行的程序的主程序main，使之可以打印任意长度的输入行的长度，并尽可能多的打印文本 答案是：   #include <stdio.h> #define MAXLINE 1000 /*最大输入行的长度*/  int getline (char line[],int maxline); void copy (char to[],char from[]);  /*打印出最长的输入行*/ main() { 	int len;                /*当前行的长度*/ 	int max;                /*目前为止最大的长度*/ 	char line[MAXLINE];     /*当前输入行*/ 	char longest[MAXLINE];  /*这里保存的最长行*/ 	 	max = 0; 	while ((len = getline(line,MAXLINE))> 0){ 		printf("%d, %s",len,line);  		if (len > max) { 			max = len; 			copy(longest, line); 		} 	} 	if (max > 0) /*there was a line*/ 		printf("%s",longest); 	return 0;  }   /*getline:将各行数据读取，写入s数组,并返回长度*/ int getline (char s[],int lim) { 	int c,i,j; 	 	j = 0; 	for (i = 0 ; (c = getchar())!= EOF && c!='\n'; ++i) 		if (i < lim-2){ 			s[j] = c;           /*line still in bounearies*/ 			++j; 		} 	if (c == '\n'){ 		s[i] = c; 		++j; 		++i; 	} 	s[j] = '\0'; 	return i; }  /*copy:copy'from'into 'to';assume to is big enough*/ void copy(char to[] ,char from[]) { 	int i; 	 	i = 0; 	while ((to[i] = from[i])!='\0')\ 		++i; }   修改前的代码是：  #include <stdio.h> #define MAXLINE 1000 /*最大输入行的长度*/  int getline (char line[],int maxline); void copy (char to[],char from[]);  /*打印出最长的输入行*/ main() { 	int len;                /*当前行的长度*/ 	int max;                /*目前为止最大的长度*/ 	char line[MAXLINE];     /*当前输入行*/ 	char longest[MAXLINE];  /*这里保存的最长行*/ 	 	max = 0; 	while ((len = getline(line,MAXLINE))> 0) 		if (len > max) { 			max = len; 			copy(longest, line); 		} 	if (max > 0) /*there was a line*/ 		printf("%s",longest); 	return 0;  }   /*getline:将各行数据读取，写入s数组,并返回长度*/ 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; }  /*copy:copy'from'into 'to';assume to is big enough*/ void copy(char to[] ,char from[]) { 	int i; 	 	i = 0; 	while ((to[i] = from[i])!='\0')\ 		++i; }   书中描述 “我们对函数getline也作了几处修改。首先，循环语句 for (i = 0; (c = getchar()) != EOF && c != '\n'; ++i) 不再检查字符数是否超出数组s的限制-因为这一限制不再是for循环的终止条件之一了，现在的getline能返回任意长度的输入行的长度，并能存储尽可能多的输入行内容。  我的问题：怎样实现的尽可能多的存储输入行内容，存储输入行内容的是数组s，最多存储1000个字符，和原程序是一样，没有增加阿  你这书写的莫名其妙

user: user-2
content: 仅供参考#include <stdio.h> #include <string.h> #define MAXLEN 1000 char ln[MAXLEN]; FILE *f; int i,z; int b,n,L; int main(int argc,char **argv) {     if (argc<2) {         printf("Usage:%s fullpathfilename.ext\nget total blank/non-blank/total linenumbers.\n",argv[0]);         return 1;     }     f=fopen(argv[1],"r");     if (NULL==f) {         printf("Can not open file [%s]!\n",argv[1]);         return 2;     }     z=0;     b=0;     n=0;     L=0;     while (1) {         if (NULL==fgets(ln,MAXLEN,f)) break;         L=strlen(ln);         if ('\n'==ln[L-1]) {             if (0==z) {                 for (i=0;i<L-1;i++) {                     if (!(' '==ln[i] || '\t'==ln[i])) break;                 }                 if (i<L-1) z=1;//当前行不是空行             }             if (0==z) b++; else n++;             z=0;         } else {             if (0==z) {                 for (i=0;i<L;i++) {                     if (!(' '==ln[i] || '\t'==ln[i])) break;                 }                 if (i<L) z=1;//当前行不是空行             }         }     }     fclose(f);     if (L>0 && '\n'!=ln[L-1]) {         if (0==z) b++; else n++;//最后一行末尾无'\n'也计算     }     printf("File:[%s] total blank/non-blank/total linenumbers is %d/%d/%d\n",argv[1],b,n,b+n);     return 0; }

user: user-0
content: 我自己刚才想了下，搞明白了，题目只是要长度，没有要更长的数组，获得长度就够了。  本人做软件测试的，想转开发或者手机app开发之类的。觉得敲代码挺有意思，等我磨练磨练...

user: user-3
content: 你没学到动态内存分配吧？ malloc函数可以分配任意长度的字节，返回首地址。 free函数可以接触malloc分配的内存，参数是一个首地址。 来，骚年，进入内存分配与泄漏的天地吧！！