Does fgets() always terminate the char buffer with \0?

前端 未结 5 1834
忘了有多久
忘了有多久 2021-02-01 21:02

Does fgets() always terminate the char buffer with \\0 even if EOF is already reached? It looks like it does (it certainly does in the implementation presented in the ANSI K&

5条回答
  •  臣服心动
    2021-02-01 21:48

    Never use gets!!

        7.19.7.2 The fgets function
        Synopsis
    1           #include 
                char *fgets(char * restrict s, int n,
                     FILE * restrict stream);
        Description
    2   The fgets function reads at most one less than the number of characters
        specified by n from the stream pointed to by stream into the array pointed
        to by s. No additional characters are read after a new-line character
        (which is retained) or after end-of-file. A null character is written
        immediately after the last character read into the array.
        Returns
    3   The fgets function returns s if successful. If end-of-file is encountered
        and no characters have been read into the array, the contents of the array
        remain unchanged and a null pointer is returned. If a read error occurs
        during the operation, the array contents are indeterminate and a null
        pointer is returned.
    

    So, yes, when fgets() does not return NULL the destination array always has a null character.

    If fgets() returns NULL, the destination array may have been changed and may not have a null character. Never rely on the array after getting NULL from fgets().


    Edit example added

    $ cat fgets_error.c
    #include 
    
    void print_buf(char *buf, size_t len) {
      int k;
      printf("%02X", buf[0]);
      for (k=1; k
    
    

    See? no NUL in buf :)

提交回复
热议问题