首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

打印最长行的程序,该怎么解决

2012-09-18 
打印最长行的程序不知道为什么,运行时会出现结束程序的情况,求指教啊#include stdio.h#define MAXLINE 1

打印最长行的程序
不知道为什么,运行时会出现结束程序的情况,求指教啊
#include <stdio.h>
#define MAXLINE 1000
int getline(char s[],int lim);
void copy(char to[],char from[]);
void main()
{
  int max=0;
  int len=0;
  char maxline[MAXLINE];

  char line[MAXLINE];//定义数组时,必须有数组界限
  while(len=getline(line,MAXLINE)>max)
  {
  if(len>max){
  copy(maxline,line);
  max=len;
  }
  }
  if(max>0)//存在这样的行
  printf("%s",maxline);

}
//getline可以读取字符串和计算字符串的长度
int getline(char s[],int lim)
{
  int i,c;
  for(i=0;i<lim-1&&(c=getchar())!=EOF&&c!='\n';++i)//要有个最大长度限制lim
  s[i]=c;
  if(c=='\n')
  {s[i]=c;//对于for语句算出i时不满足条件,此时i的值保留。故该语句可以直接用s【i】
  ++i;
  }
  if(c=='\0')
  s[i]='\0';
  return i;
}
void copy(char to[],char from[])
{
  int i;
  i=0;
  while(to[i]=from[i]!='\0')//这个编的极好的,在判断条件中赋值,判断条件是\0
  ++i;
}


[解决办法]
有两个大的问题:
1、
if(c=='\0')
s[i]='\0';
LZ真以为键盘能输入'\0'?能直接输入'\0'还用设置个结束符^Z(EOF)干嘛……
2、基础中的基础:运算符优先级。
while((len=getline(line,MAXLINE))>max)
while((to[i]=from[i])!='\0')//这个编的极好的,在判断条件中赋值,判断条件是\0
[解决办法]
1 #include <stdio.h>

3 #define MAXLINE 1000

5 int getline1 (char s[], int lim);
6 void copy (char to[], char from[]);

8 int
9 main (void)
 10 {
 11 int max = 0;
 12 int len = 0;
 13 char maxline[MAXLINE];
 14 
 15 char line[MAXLINE];
 16 while ((len = getline1 (line, MAXLINE)) > max)
 17 {
 18 #if 0
 19 if (len > max)
 20 {
 21 copy (maxline, line);
 22 max = len;
 23 }
 24 #else
 25 copy (maxline, line);
 26 max = len;
 27 #endif
 28 }
 29 if (max > 0)
 30 printf ("%s", maxline);
 31 return 0;
 32 }
 33 
34 //getline可以读取字符串和计算字符串的长度
 35 int
 36 getline1 (char s[], int lim)
 37 {
 38 int i, c;
 39 for (i = 0; i < lim - 1 && (c = getchar ()) != EOF && c != '\n'; ++i) 
 40 s[i] = c;
 41 if (c == '\n')
 42 {
 43 s[i] = c;
 44 ++i;
 45 }
 46 #if 1
 47 s[i] = 0;
 48 #else
 49 if (c == '\0')
 50 s[i] = '\0';
 51 #endif
 52 return i;
 53 }
 54 
 55 void
 56 copy (char to[], char from[])
 57 {
 58 int i;
 59 i = 0;
 60 while ((to[i] = from[i]) != '\0') 
 61 ++i;
 62 }

对你的程序作了一下小的修改,我想你是在windows下编写的该程序吧,我在linux下会报getline在库中已经定义了,所以我修改了你的函数名。
作为一个参考吧。
[解决办法]
仅供参考

C/C++ code
#include <stdio.h>#include <string.h>#define MAXLEN 1000char 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;} 

热点排行