fgets() pas d'attente pour l'entrée
J'ai écrit le code suivant:
int N;
scanf("%d", &N);
int i;
for (i = 0; i < N; i++) {
char line[LINE_MAX];
if (fgets(line, LINE_MAX, stdin) != NULL) {
//do stuff with line here
printf("%c - %c\n", line[0], line[1]);
}
}
J'ai un fichier d'entrée qui a le nombre de lignes qu'il a, et alors que le nombre de lignes qui je veux processus. J'ai donc lu dans le nombre de lignes dans N
. Après cela, j'utilise fgets
pour obtenir la ligne pour être en mesure de le traiter.
Cependant, fgets
ne semble pas attendre pour un stdin la première fois. Je reçois toujours un sortie de -
, puis il attend d'entrée. Sens, la première itération de la boucle, il n'est pas d'attente pour l'entrée standard à fgets
et se contente d'afficher deux vide de caractères séparés par des -
que mon printf
n'.
Pourquoi est-ce? Comment puis-je obtenir fgets
attendre d'entrée à chaque fois? J'ai l'impression que c'est un problème thread.
Vous devez vous connecter pour publier un commentaire.
Comme geekosaur dit, vous n'êtes pas de la manipulation de la nouvelle ligne de gauche derrière par
scanf
. Vous pouvez modifier votrescanf
chaîne de format, de la prendre en compte:*[^\n]
dit de tout ignorer après votre entrée entière qui n'est pas un retour à la ligne, mais ne pas faire n'importe quoi avec le retour à la ligne (ignorer).Programme de Test de sortie:
fgets()
, qui n'est généralement pas ce qui est prévu.Il n'a rien à voir avec le filetage.
scanf()
lit exactement ce que vous lui demandez; c'est en laissant tout le reste non lu, notamment le retour à la ligne après les données. (Vous aussi vous n'êtes pas face à la possibilité que l'utilisateur n'a pas le type que vous souhaitez.)Si vous voulez faire ligne orientée d'entrée, utilisez
fgets()
. N'utilisez pas descanf()
et espérons que le système peut magiquement intuit que vous voulez ignorer ce que vous n'avez pas lu.char Nc[1]
etfgets(Nc, 1, stdin)
mais encore une fois,fgets
ne pas attendre de lire quoi que ce soit. Le programme existe.Vous pouvez passer un appel à
fflush()
juste après le scanf() comme ceci:De sorte que le caractère de saut de ligne ges effacé de la
stdin
tampon et la prochainefgets()
va arrêter pour demander de l'entrée.