0

我正在使用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),为了清除输入流真的需要吗?

4

2 回答 2

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.**

它永远不会知道是否有任何字符被截断,因为你让它只从文件中读取那么多字符

于 2013-03-29T19:11:42.930 回答
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.

相反,阅读直到流结束(或只是关闭它)。

于 2013-03-29T18:14:21.980 回答