我正在从K&R的“The C Programming Language”一书中学习C语言。我正在做本书中指定的练习。我的运动编号为1.16,但我不明白。
练习1.16:
修改最长行程序的主程序,以便正确打印任意长输入行的长度,并尽可能多地打印文本。
我的问题:
也许我不明白这个任务。我的理解是我必须删除1000个字符的限制。
这是K&R的早期练习,您只需对代码进行一些小的更改,而不是对代码进行全面的重新设计。
longest
缓冲区中的内容来实现的。即打印出最多1000个字符的行。同样,这是一个早期的练习,几乎没有介绍动态分配的内存。在编写K&R时,存储任意长的文本行并不像今天那样可行。int
的范围内。)解决此问题的一种方法是:
line
缓冲区的最后一个字符是否为换行符('\ n')len
变量是行的正确长度(getline()的返回值,与原始代码相比不需要特别考虑。len++
算。len
现在是该行的实际长度,但是我们的缓冲区只有它的前999个字符。line
缓冲区(最多1000个字符)。longest
缓冲区)和max
变量的长度。
由于上面提到的while循环,max
长度现在是正确的。
如果longest
线确实超过1000个字符。你至少打印出那些前999个字符 - 这是“尽可能多”。我不会破坏它并发布你需要完成这个的代码,但是你只需要添加6行代码就可以添加到练习1-16的最长行程序中。
MAXLINE
大小的缓冲区肯定会包含换行符。这是我的版本:
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;
}
if(c!=EOF)
{
while((c=getchar())!=EOF&&c!='\n')
i++;
}
s[i]='\0';
return i;
}
#define MAXLINE 1000
int len;
int max;
char line[MAXLINE];
char longest[MAXLINE];
max=0;
while((len=getline(line,MAXLINE))>1)
{
if(len>max)
{
max=len;
copy(longest,line);
}
}
if(max>0)
{
printf("%d:%s",max,longest);
}
return 0;
由于某些未知的原因,示例代码在我的电脑上不起作用,特别是当条件为'len> 0'时,循环不会结束我认为主要原因是当你什么都不输入时,你仍然需要按回车键,所以收到'\ n',len为1;我认为它满足打印任意长输入行的长度和尽可能多的文本的要求。 And it works like this
#include
main()
{
long tlength = 0;
short input, llength = 1;
while (llength > 0) {
llength = 0;
while ((input = getchar()) != EOF) {
++llength;
if (input == '\n')
break;
}
tlength = tlength + llength;
printf("\nLength of just above line : %5d\n\n", llength);
}
printf("\n\tLength of entire text : %8ld\n", tlength);
return 0;
}
据我说,这个问题只想要每个任意行的长度+最后整个文本的长度。
尝试运行此代码并告诉我根据问题是否正确,因为我在这个问题上太混淆了。