我使用fgets从用户那里获取名称,并将其放入char数组中。
如果用户在maxsize
中提供fgets
以外的代码,则我的程序有问题。我认为如果用户超过maxsize
,则会返回NULL
。但是事实并非如此。我该如何控制此错误?
我当然可以将maxsize
设置为200甚至更高。但是我认为这不是一个很好的解决方案。
我在fgets
语句中使用了if
,如果它是==NULL
,我会打印一个错误,但是正如我已经告诉我的那样,如果用户超过{{1 }}。
maxsize
答案 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()
出现问题。