为了账号安全,请及时绑定邮箱和手机立即绑定

使用scanf()读取行不好吗?

使用scanf()读取行不好吗?

C
月关宝盒 2019-11-02 14:10:25
scanf(" %[^\n]",line);我的一个朋友建议,使用fgets()读取行作为输入比使用scanf()上面的语句中的输入要好得多。他有道理吗?
查看完整描述

3 回答

?
largeQ

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[])。


查看完整回答
反对 回复 2019-11-02
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

C FAQ中有关于scanf的问题的一些详细说明:


更一般而言,scanf是为相对结构化的格式化输入而设计的(其名称实际上是从“扫描格式化”派生的)。如果您注意的话,它会告诉您它是成功还是失败,但是它只能告诉您它在哪里失败,而根本不告诉您如何或为什么。您几乎没有机会进行任何错误恢复。


查看完整回答
反对 回复 2019-11-02
?
皈依舞

TA贡献1851条经验 获得超3个赞

fgets会比这更好scanf。scanf如OP中所述,可能存在以下问题


1)@Grijesh建议的缓冲区溢出


2)scanf由于换行符留在输入流中,因此此操作之后的下一个可能不起作用。(如果您错过了空格)


查看完整回答
反对 回复 2019-11-02
  • 3 回答
  • 0 关注
  • 590 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信