Fgets-如何防止用户超过Maxsize?

时间:2019-06-01 09:01:38

标签: c fgets

我使用fgets从用户那里获取名称,并将其放入char数组中。 如果用户在maxsize中提供fgets以外的代码,则我的程序有问题。我认为如果用户超过maxsize,则会返回NULL。但是事实并非如此。我该如何控制此错误?

我当然可以将maxsize设置为200甚至更高。但是我认为这不是一个很好的解决方案。

我在fgets语句中使用了if,如果它是==NULL,我会打印一个错误,但是正如我已经告诉我的那样,如果用户超过{{1 }}。

maxsize

2 个答案:

答案 0 :(得分:2)

fgets而言,这不是错误。当您执行fgets(name, 20, stdin)时,它将仅从标准输入中读取最多19个字符(如果其中一个字符为'\n',则最多读取19个字符)。其余字符将保留在stdin中,对输入函数的下一次调用将提取它们。

您可以通过检查是否成功调用fgets来发现这种情况,其中字符串不包含'\n'

if (!fgets(name, 20, stdin)) {
    // fgets failed; handle error
}
if (!strchr(name, '\n')) {
    // no newline in 'name'; a partial line was read
}

然后,您可以选择分配更大的缓冲区,或者将其余的行扔掉,或者向用户抱怨。

答案 1 :(得分:0)

  

我当然可以将maxsize设置为200甚至更大。但是我认为这不是一个很好的解决方案。

这种方法还不错。

创建一些允许{em> huge 行的my_gets(),可以无限制地控制用户输入的内存资源-潜在的黑客利用。大行很可能是错误的输入或恶意的代码黑客。

我会选择@Constantine Georgiou并使用较大但合理的上限。然后检测大行,如错误/敌对。

请注意,文本文件行具有环境限制。因此,证明巨大的缓冲区可能没有意义。

  

实现应支持文本文件,该文件的行至少包含254个字符,包括终止换行符。宏BUFSIZ的值至少应为256。C11§7.21.27

#define MY_BUFSIZE ((BUFSIZE < 4096) ? BUFSIZE : 4096)

char name[MY_BUFSIZE + 2];
if (fgets(name, sizeof name, stdin)) {
  if (strlen(name) >= MY_BUFSIZE) Too_long_error(); 

注意:输入内容异常地读入空字符,从而导致fgets()出现问题。