2017-02-23 4 views
0

J'ai le segment de code suivant dans un de mes programmes:Quelle taille devrait-on utiliser pour les fgets?

char input[LINE_SIZE + 1]; /* +1 for '\0'. */ 

while(fgets(input, LINE_SIZE, stdin) != NULL) 
{ 
    /* Do stuff. */ 
} 

Dans une question qui a depuis été supprimé, il me l'a fait remarquer que mon code pourrait être buggy. Je déclare les chaînes avec la notation "+ 1" pour rendre le code plus informatif et lisible (en veillant à ne pas oublier de prendre en compte le terminateur NULL, car cela était un problème). Cependant, on m'a dit que le fgets devrait utiliser exactement la même taille pour son deuxième paramètre. J'ai vu d'autres articles ici qui font les mêmes pratiques que moi.

Je ne suis pas certain. Est-ce une mauvaise pratique de ne pas inclure le "+ 1" dans le paramètre fgets?

+3

Le plus/moins 1 n'est pas nécessaire. Suggérer 'fgets (input, sizeof input, stdin)' quand 'input' est un tableau. – chux

+1

Pourquoi transmettre une valeur que vous * connaissez * est désactivée de 1? Cela dit, il est de 1 dans la direction sûre, donc pose peu de risque réel. –

+1

pour 'char input [LINE_SIZE + 1];', 'LINE_SIZE' est le nombre maximum de caractères (sans compter le terminateur), et' LINE_SIZE + 1' est la taille réelle du tableau. Pour 'fgets()', vous passez la taille du tableau ... il lira au plus un caractère de moins que cela, et ajoutera le terminateur. – Dmitri

Répondre

3
7.21.7.2 La fonction fgets

Synopsis

              #include <stdio.h>
                  char *fgets(char * restrict s, int n, FILE * restrict stream);

description

        La fonction fgets lit au maximum une de moins que le nombre de caractères spécifié par n du flux pointé par stream dans le tableau pointé par s. Aucun caractère supplémentaire n'est lu après un caractère de nouvelle ligne (qui est conservé) ou après la fin du fichier. Un caractère nul est écrit immédiatement après le dernier caractère lu dans le tableau.

C 2011 Online Draft

Je souligne.

Si vous spécifiez LINE_SIZE, puis fgets lira au plusLINE_SIZE - 1 caractères en input, et écriront une terminaison 0 après le dernier caractère d'entrée. Notez que fgets va stocker le caractère de nouvelle ligne s'il y a de la place.

+0

Ceci explique la question grandement. Je vous remercie. Je devrais changer toutes les occurrences de 'fgets' en utilisant' LINE_SIZE' à 'LINE_SIZE + 1'. – moosefoot

0

Je ne peux pas commenter (< 50 points), mais:

si vous utilisez

char input[LINE_SIZE ]; 

while(fgets(input, LINE_SIZE, stdin) != NULL) 
{ 
    /* Do stuff. */ 
} 

fgets() ne sera pas écrire au-delà de votre entrée tampon [], si vous avez réellement besoin des caractères LINE_SIZE capturé, vous recevrez ce dernier caractère par lui-même lors de l'appel suivant, auquel vous ne vous attendez peut-être pas.

aussi: le mot-clé sizeof ne reviendra pas la taille complète des allocations d'exécution, de sorte que vous devrez garder une trace des tampons sont alloués dynamiquement et utiliser une autre méthode:

char * input = malloc(50)  
fgets(input, sizeof input, stdin) 

lit 8 (LP64) caractères