目录
《C程序设计语言》笔记一
前言
在读《C程序设计语言》第一章导言1.9字符数组中举例了一个程序——读入一组文本行,并把最大的文本行打印出来,实际运行时,发现并不能正常打印。先将问题现象、原因、解决方式记录。
源程序
#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)
{
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;i
}
//copy函数:将form复制到to;这里假定to足够大
void copy(char to[],char from[])
{
int i;
i = 0;
while ((to[i]= from[i]) != '\0')
{
++i;
}
}
问题现象
个人预计现象如下:
-
正常输入字符串,按下回车进入下一行
-
在新的一行中输入字符串,继续进入下一行
-
在新的一行中不做任何输入,回车打印出最长的一行
运行程序后,现象如下:
-
正常输入字符串,按下回车进入下一行
-
在新的一行中输入字符串,继续进入下一行
-
在新的一行中不做任何输入,回车无反应
-
不知道该如何打印最长行
问题原因
回头分析代码,发现问题出现在getline函数中这段
if (c == '\n')
{
s[i] = c;
++i;
}
s[i] = '\0';
return i;
即当你按下回车后,变量i
最后返回值为1,无法为0,while循环就不会结束。
解决办法
一开始,我首先想的是将while循环做如下修改
修改前:
while ((len = getline(line,MAXLINE)) > 0)
修改后:
while ((len = getline(line,MAXLINE)) > 1)
当你为输入字符,直接在新一行回车后,就自动打印最长的字符串。
但后来细想,《C程序设计语言》是经典C语言书籍,不可能出现这样的错误,回看getline函数,发现只做了变量c
等于回车的判断后加1,如果输入EOF,应该就能输出结果。
此时涉及到操作系统的问题,在Windows下程序结束为CTRL+c,但在Ubuntu下CTRL+c为程序后台运行,需要执行CTRL+z结束程序。
验证在原程序下,输入多行字符后,按下CTRL+z,打印最长文本行。