在stdin检索上输入行大小

时间:2013-03-29 17:59:01

标签: c fgets

我正在使用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)吗?

2 个答案:

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

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