#define MAXLINE 1000 //允许输入行的最大长度
int getline(char line[],int maxline);
void copy(char to[],char from[]);
//print the longest line
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){
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函数:将from复制到to;这里假定to足够大
void copy(char to[],char from[])
{
int i;
i = 0;
while((to[i] = from[i])!=”\0”){
++i;
}
}
上面这段代码是要求输出最长行,下面这段代码要求可以输出任意长度的行,其中有一句代码上的差异本人不太理解,就是上面这段中的i<lim-1,和下面这段中的(i<lim-2),作者给出的理解是”应为数组s的最后一个下标是lim-1,而这又是原因是数组s中有lim个元素且我们已经读取了输入字符,所以i<lim-2将在数组s里给换行符留出一个位置‘\n’,还有给字符串结束符流出一个位置”\0″“,本人这里的不解是既然第一段代码也需要留出空间给‘\n’和”\0″(已经做过断点测试)为什么第一段不写成第二段的i<lim-2呢?
#include<stdio.h>
#define MAXLINE 1000 //允许输入行的最大长度
int getline(char line[],int maxline);
void copy(char to[],char from[]);
//print the longest line
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){
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[i] = c;
++j;
}
}
if(c == “\n”){
s[j] = c;
++j;
++i;
}
s[j] = “\0″;
return i;
}
//copy函数:将from复制到to;这里假定to足够大
void copy(char to[],char from[])
{
int i;
i = 0;
while((to[i] = from[i])!=”\0”){
++i;
}
}
20
#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; }