0

以下程序读取一组行并打印最长的行。它是从 K&R 借来的。

#include<stdio.h>
#include<conio.h>
#define MAX 1000
int getline(char line[],int max);
void copy(char to[],char from[]);
void main()
{
int len,max=0;
char ch,char line[MAX],longest[MAX];
while((len=getline(line,MAX))>0)  /* Checking to see if the string has a positive length */
{
   if(len>max)
   {
      max=len;
      copy(longest,line);      /* Copying the current longer into the previous longer line */
   }
}
if(max>0)         /* Checking to see if the length of the string is positive */
{
printf("%s",longest);
}
}
/* Function to input the lines for comparison */
int getline(char line[],int limit)
{
int i;
char ch;
/* This for loop is used to input lines for comparison */
for(i=0;i<limit&&(ch=getchar())!=EOF&&ch!='\n';i++)   /* Q#1 */
{
  line[i]=ch;
}
if(ch=='\n')
{
  line[i]=ch;
  i++;
}
line[i]='\0';  /* Q#2 */
}
void copy(char to[],char from[])
{
  int i=0;
  while((to[i]=from[i])!='\0')
  {
    i++;
  }
}

Q#1:- 为什么我们不能使用 '\n' 代替 EOF 和 '\0' 代替 '\n' ?毕竟,我们所做的只是表示行的结尾和字符串的结尾,对吧?

Q#2:- 当我们知道只有最后一个词将包含空字符时。为什么我们使用“i”作为索引?为什么不能直接用“limit”作为索引呢?这也应该做的工作,对不对?请解释。

4

2 回答 2

1

Q1:字符串和线条是不同的东西。一个字符串可以由多行组成。例如,对于以下情况是完全合法的:

abc
xyz

成为一个单一的字符串。

Q2:在这种情况下,limit 表示循环的上限;您的复制可能会在它之前结束 - 只需查看控制循环的其他条件。此外,即使您可以使用 limit 作为索引,您仍然需要保留当前位置的索引。

于 2013-01-02T21:30:42.110 回答
0

Q#1:- 为什么我们不能使用 '\n' 代替 EOF 和 '\0' 代替 '\n' ?毕竟,我们所做的只是表示行的结尾和字符串的结尾,对吧?

如果你的输入有多于一行怎么办?

Q#2:- 当我们知道只有最后一个词将包含空字符时。为什么我们使用“i”作为索引?为什么不能直接用“limit”作为索引呢?这也应该做的工作,对不对?请解释。

您需要知道您在循环中的距离以及总共循环的次数 - 您可以单独使用limit,但这会使代码变得更加复杂。

于 2013-01-02T21:29:14.943 回答