我正在使用fgets()
函数将字符串存储在具有固定大小的结构中。
if(fgets(auth_data->user_id, USR_SIZE, stdin) == NULL)
EXIT_ON_ERROR_("Error on fgets function\n");
fflush(stdin);
我知道所有收到的字符串大小都超过USR_SIZE -1
。我需要知道输入字符串的大小正好(USR_SIZE -1
加'\0'
个字符。)
为此,我可以在它们上面调用strlen
来检查字符串是否有< USR_SIZE -1
长度。但我如何检查原始字符串是否被fgets
剪切。
在这两种情况下,我首先知道字符串的格式不正确。
此外,为了清除输入流真的需要fflush(stdin)
吗?
答案 0 :(得分:0)
fgets将缓冲区中的换行符存储为最后一个字符。缓冲区中没有换行符表示EOF(用feof检查)或字符串被剪切。
或者您可以使用fread()循环替换所有验证代码,该循环读取预设的字节数。
在输入流上调用fflush是不正确的。从GNU libc手册:
遵守 C89,C99,POSIX.1-2001,POSIX.1-2008。
The standards do not specify the behavior for input streams. Most other implementations behave the same as Linux.
相反,请读取直到流的结尾(或者只是关闭它)。
答案 1 :(得分:0)
fgets的手册页说 说明
The fgets() function reads at most one less than the number of characters
specified by size from the given stream and stores them in the string
str. Reading stops when a newline character is found, at end-of-file or
error. The newline, if any, is retained. If any characters are read and
there is no error, a `\0' character is appended to end the string.
返回值
Upon successful completion, fgets() and gets() return a pointer to the
string. If end-of-file occurs before any characters are read, they
return NULL and the buffer contents remain unchanged. If an error
occurs, they return NULL and the buffer contents are indeterminate. **The
fgets() and gets() functions do not distinguish between end-of-file and
error, and callers must use feof(3) and ferror(3) to determine which
occurred.**
永远不会知道是否有任何字符被截断,因为你只是从文件中读取了许多字符