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:- EOF の代わりに '\n' と '\n' の代わりに '\0' を使用できないのはなぜですか? 結局のところ、行の終わりと文字列の終わりを示すだけですよね?

Q#2:- 最後の用語のみにヌル文字が含まれることがわかっている場合。なぜインデックスとして「i」を使用するのですか? 「制限」をインデックスとして直接使用できないのはなぜですか? これも仕事をするはずですよね?説明してください。

4

2 に答える 2

1

Q1:文字列と行は別物です。文字列は複数の行で構成できます。たとえば、次の場合は完全に合法です。

abc
xyz

単一の文字列になります。

Q2:この場合の制限は、ループの上限を示します。コピーはその前に終了する可能性があります。ループを制御している他の条件を見てください。また、制限をインデックスとして使用できる場合でも、現在の位置のインデックスを保持する必要があります。

于 2013-01-02T21:30:42.110 に答える
0

Q#1:-EOFの代わりに「\ n」を使用できず、「\ n」の代わりに「\0」を使用できないのはなぜですか?結局のところ、私たちがしているのは、行の終わりと文字列の終わりを示すことだけですよね?

入力に複数の行がある場合はどうなりますか?

Q#2:-最後の用語だけにヌル文字が含まれることがわかっている場合。なぜ「i」をインデックスとして使用するのですか?インデックスとして「limit」を直接使用できないのはなぜですか?これも仕事をするはずですよね?説明してください。

ループ内の距離と、ループの合計回数を知る必要があります。limit単独で使用することもできますが、コードが非常に複雑になります。

于 2013-01-02T21:29:14.943 に答える