Comment getline() de la fonction de travail ici?
Je ne comprends pas comment la fonction getline
est de travailler ici. Pourquoi le caractère de saut de ligne été exclus de la boucle for et pourquoi est-il tester la présence de caractère de saut de ligne dans un bloc séparé?
#include <stdio.h>
#define MAXLINE 1000 /* maximum input line length */
int getline(char line[], int maxline);
void copy(char to[], char from[]);
/* print the longest input line */
main()
{
int len; /* current line length */
int max; /* maximum length seen so far */
char line[MAXLINE]; /* current input line */
char longest[MAXLINE]; /* longest line saved here */
max = 0;
while ((len = getline(line, MAXLINE)) > 0)
if (len > max) {
max = len;
copy(longest, line);
}
if (max > 0) /* there was a line */
printf("%s", longest);
return 0;
}
/* getline: read a line into s, return length */
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] = '#include <stdio.h>
#define MAXLINE 1000 /* maximum input line length */
int getline(char line[], int maxline);
void copy(char to[], char from[]);
/* print the longest input line */
main()
{
int len; /* current line length */
int max; /* maximum length seen so far */
char line[MAXLINE]; /* current input line */
char longest[MAXLINE]; /* longest line saved here */
max = 0;
while ((len = getline(line, MAXLINE)) > 0)
if (len > max) {
max = len;
copy(longest, line);
}
if (max > 0) /* there was a line */
printf("%s", longest);
return 0;
}
/* getline: read a line into s, return length */
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;
}
/* copy: copy 'from' into 'to'; assume to is big enough */
void copy(char to[], char from[])
{
int i;
i = 0;
while ((to[i] = from[i]) != '\0')
++i;
}
';
return i;
}
/* copy: copy 'from' into 'to'; assume to is big enough */
void copy(char to[], char from[])
{
int i;
i = 0;
while ((to[i] = from[i]) != '#include <stdio.h>
#define MAXLINE 1000 /* maximum input line length */
int getline(char line[], int maxline);
void copy(char to[], char from[]);
/* print the longest input line */
main()
{
int len; /* current line length */
int max; /* maximum length seen so far */
char line[MAXLINE]; /* current input line */
char longest[MAXLINE]; /* longest line saved here */
max = 0;
while ((len = getline(line, MAXLINE)) > 0)
if (len > max) {
max = len;
copy(longest, line);
}
if (max > 0) /* there was a line */
printf("%s", longest);
return 0;
}
/* getline: read a line into s, return length */
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;
}
/* copy: copy 'from' into 'to'; assume to is big enough */
void copy(char to[], char from[])
{
int i;
i = 0;
while ((to[i] = from[i]) != '\0')
++i;
}
')
++i;
}
Vous devez vous connecter pour publier un commentaire.
getline
va lire une seule ligne destdin
. Depuis les lignes sont séparées par des sauts de ligne ('\n'
caractères),getline
va lire jusqu'à et y compris le retour à la ligne. Il ne serait pas logique pourgetline
à lire après le saut de ligne, car il serait alors la lecture de plus d'une ligne.Il y a trois cas qui peuvent causer de la boucle for pour arrêter.
1) un
\'n'
a été rencontrée.Si cela se produit, il va ajouter la nouvelle ligne à la fin de la chaîne avant d'ajouter le terminateur null. C'est ce que le
if (c == '\n')
est pour.2) EOF est lire ou 3) le montant maximum de caractères à lire, lire.
Si l'un de ces cas se présente, l'ajout de la nouvelle ligne à la fin de la chaîne est ignoré et seulement le terminateur null est ajouté.
Null terminater (le
'\0'
caractère) est de savoir comment C indique la fin d'une chaîne.La raison pour laquelle ils sont en excluant les \n dans la boucle, puis la suite de vérifier pour le \n est parce que la valeur de c est toujours allouée (toujours dans la portée) après la boucle est terminée. une raison pour laquelle il me semble un peu compliqué, c'est qu'ils ont décidé d'exclure les supports. Puisque la fonction est d'obtenir la ligne suivante une ligne "fin" lorsque vous obtenez le caractère de saut de ligne "\n". Pour écrire ce coup c'est un peu plus lisible, il devrait ressembler à:
Il y a trois cas importants à considérer lors de la lecture jusqu'à la fin d'une ligne. Qui sont les suivants:
EOF
et donc il n'y a rien d'autre à lire.Dans le
for
boucle, les suivantes:i < ( lim - 1 )
vérifie cas 1.( c = getchar() ) != EOF
vérifie cas 2 (laid).c != '\n'
vérifie cas 3.... la raison pour laquelle il a besoin de court-circuit que le saut de ligne est en lecture est parce que c'est l'intension de la fonction. Il lit également en place pour le caractère de saut de ligne et l'inclut dans la chaîne. La dernière étape:
... assure que c'est un
NULL
chaîne terminée (la convention en C). Ensuite, elle retourne le nombre d'octets lus (ce qui n'est pas rare).Bien, je suis venu avec cette question. Voici la réponse à votre question.
1)La première idée fausse à cette question est getline lui-même.
En particulier dans ce code getline est une fonction définie par l'utilisateur.
Certains compilateur peut apparaître un message d'erreur. Donc, essayez un autre nom pour cette fonction(Peut-être getl ou quelque chose que vous trouverez convenable pour vous-même)
2)Deuxièmement, main() agit comme intermédiaire pour l'acceptation de la chaîne d'entrée.
Il vérifie si la longueur de la chaîne d'entrée (calculée par la fonction getline() ) est supérieure à zéro et max.
3)La fonction de copie en copie la valeur de la chaîne la plus longue dans le tableau de caractères plus longue.
Lors de l'impression du code dit : printf("%s",la plus longue);
Maintenant une question se pose. Pourquoi pas une boucle for pour imprimer la chaîne.
Eh bien, c'est aussi correct, mais il faudra plus de mesures et d'itérations qui est inefficace.
C'est ce que je suis venu avec.