fgets()是否始终以\ 0终止char缓冲区? [英] Does fgets() always terminate the char buffer with \0?

查看:62
本文介绍了fgets()是否始终以\ 0终止char缓冲区?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

即使已经到达EOF,fgets()是否始终以\ 0终止char缓冲区?看起来确实如此(它确实在ANSI K& R书中介绍的实现中确实如此),但我想我想确定一下.

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&R book), but I thought I would ask to be sure.

我想这个问题也适用于其他类似的函数,例如gets().

I guess this question applies to other similar functions such as gets().

我知道在正常"情况下会附加\ 0,我的问题针对的是EOF或错误情况.例如:

I know that \0 is appended during "normal" circumstances, my question is targeted at EOF or error conditions. For example:

FILE *fp;
char b[128];
/* ... */
if (feof(fp)) {
    /* is \0 appended after EACH of these calls? */
    fgets(b, 128, fp);
    fgets(b, 128, fp);
    fgets(b, 128, fp);
}

推荐答案

从不使用!


    7.19.7.2 The fgets function
    Synopsis
1           #include <stdio.h>
            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.

因此,,当 fgets()不返回NULL时,目标数组始终具有空字符.

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

如果 fgets()返回NULL,则目标数组可能已更改,并且可能没有空字符.从 fgets()获取NULL后,切勿依赖该数组.

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().

编辑示例


$ cat fgets_error.c
#include <stdio.h>

void print_buf(char *buf, size_t len) {
  int k;
  printf("%02X", buf[0]);
  for (k=1; k<len; k++) printf(" %02X", buf[k]);
}

int main(void) {
  char buf[3] = {1, 1, 1};
  char *r;

  printf("Enter CTRL+D: ");
  fflush(stdout);
  r = fgets(buf, sizeof buf, stdin);
  printf("\nfgets returned %p, buf has [", (void*)r);
  print_buf(buf, sizeof buf);
  printf("]\n");

  return 0;
}
$ ./a.out
Enter CTRL+D:
fgets returned (nil), buf has [01 01 01]
$

看到了吗?buf中没有NUL:)

See? no NUL in buf :)

这篇关于fgets()是否始终以\ 0终止char缓冲区?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆