2017-02-23 14 views
0

Ich habe das folgende Codesegment in einem meiner Programme:Welche Größe sollte für Fgets verwendet werden?

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

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

In einer Frage, die seit gelöscht, es wurde mir darauf hingewiesen, dass mein Code möglicherweise fehlerhaft sein könnte. Ich deklariere Zeichenfolgen mit der "+ 1" -Notation, um den Code informativer und lesbarer zu machen (um sicherzustellen, dass ich nicht vergesse, den NULL-Terminator zu berücksichtigen, da dies früher ein Problem war). Allerdings wurde mir gesagt, dass die fgets die exakt gleiche Größe für seinen zweiten Parameter verwenden sollte. Ich habe andere Beiträge hier gesehen, die die gleichen Praktiken wie ich machen.

Ich bin unsicher. Ist es eine schlechte Übung, das "+ 1" nicht auch in den fgets-Parameter aufzunehmen?

+3

Das Plus/Minus 1 wird nicht benötigt. Schlage 'fgets (input, sizeof input, stdin)' vor, wenn 'input' ein Array ist. – chux

+1

Warum einen Wert, den du * kennst *, um 1 überschreiten? Wenn man das gesagt hat, ist es in sicherer Richtung um 1, so dass es ein geringes tatsächliches Risiko darstellt. –

+1

für 'char-Eingabe [LINE_SIZE + 1];', 'LINE_SIZE' ist die maximale Anzahl von Zeichen (ohne den Terminator), und' LINE_SIZE + 1' ist die tatsächliche Größe des Arrays. Für 'fgets()' übergeben Sie die Größe des Arrays ... es liest maximal ein Zeichen weniger als das und fügt den Terminator hinzu. – Dmitri

Antwort

3
7.21.7.2 Die fgets Funktion

Synopsis

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

Beschreibung

        fgets Die Funktion liest höchstens eine weniger als die Zahl der durch n spezifizierten Zeichen aus dem Strom, auf den durch s stream in das Array gerichtet. Es werden keine zusätzlichen Zeichen nach einem Zeichen für eine neue Zeile (das beibehalten wird) oder nach dem Ende der Datei gelesen. Ein Nullzeichen wird unmittelbar nach dem letzten in das Array gelesenen Zeichen geschrieben.

C 2011 Online Draft

Hervorhebung hinzugefügt.

Wenn Sie LINE_SIZE angeben, dann wird fgetshöchstensLINE_SIZE - 1 Zeichen in input, lesen und einen 0-Terminator nach dem letzten Eingabezeichen schreiben. Beachten Sie, dass fgets das Zeilenvorschubzeichen speichert, wenn Platz vorhanden ist.

+0

Dies erklärt die Frage sehr. Vielen Dank. Ich werde alle Vorkommen von 'fgets' mit' LINE_SIZE' in 'LINE_SIZE + 1' ändern müssen. – moosefoot

0

kann ich nicht kommentieren (< 50 Punkte), aber:

wenn Sie

char input[LINE_SIZE ]; 

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

fgets() verwenden, wird über die Eingabe [] Puffer nicht schreiben, aber wenn Sie LINE_SIZE Zeichen tatsächlich benötigt erfasst, erhalten Sie beim nächsten Anruf das letzte Zeichen, das Sie nicht erwarten.

auch: das sizeof Schlüsselwort wird die volle Größe der Laufzeitzuordnungen nicht zurück, so dass Sie im Auge behalten müssen, werden von dem Puffer dynamisch zugewiesen werden und eine andere Methode verwenden:

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

liest 8 (LP64) Zeichen

Verwandte Themen