fgets()是否始终以\ 0终止char缓冲区? [英] Does fgets() always terminate the char buffer with \0?
问题描述
即使已经到达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屋!