Code Bye

求帮助解答问题

#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){
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;
}

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明求帮助解答问题