3 回答
TA贡献2039条经验 获得超7个赞
char * fgets ( char * str, int num, FILE * stream );可以安全使用,因为它避免了缓冲区溢出问题,它仅扫描num-1char数。
从流中读取字符,并将它们作为C字符串存储到str中,直到已读取(num-1)个字符或到达换行符或到达文件末尾为止,以先发生的为准。
这里的第二个参数num是要复制到str中的最大字符数(包括终止的空字符)。
例如,假设您的代码中的字符串数组容量仅为5chars,如下所示。
char str[5];
fgets (str, 5, fp); //5 =you have provision to avoid buffer overrun
使用上面的代码,如果从输入fp长度超过4字符,fgets()会读只是第一个4字符,然后追加\0(和丢弃其它多余输入字符,只是存储在五个字符str[])。
而scanf(" %[^\n]",str);会读,直到\n没有发现,如果输入的字符串长度超过4字符scanf()会导致缓冲区溢出(因为scanf会尝试访问内存到最大的索引4中str[])。
TA贡献1828条经验 获得超4个赞
C FAQ中有关于scanf的问题的一些详细说明:
更一般而言,scanf是为相对结构化的格式化输入而设计的(其名称实际上是从“扫描格式化”派生的)。如果您注意的话,它会告诉您它是成功还是失败,但是它只能告诉您它在哪里失败,而根本不告诉您如何或为什么。您几乎没有机会进行任何错误恢复。
TA贡献1851条经验 获得超3个赞
fgets会比这更好scanf。scanf如OP中所述,可能存在以下问题
1)@Grijesh建议的缓冲区溢出
2)scanf由于换行符留在输入流中,因此此操作之后的下一个可能不起作用。(如果您错过了空格)
- 3 回答
- 0 关注
- 590 浏览
添加回答
举报