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

scanf(" %[^\n]",line);

我的一个朋友建议,使用fgets()读取行作为输入比使用scanf()上面的语句中的输入要好得多。他有道理吗?


月关宝盒
浏览 591回答 3
3回答

largeQ

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

明月笑刀无情

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

皈依舞

fgets会比这更好scanf。scanf如OP中所述,可能存在以下问题1)@Grijesh建议的缓冲区溢出2)scanf由于换行符留在输入流中,因此此操作之后的下一个可能不起作用。(如果您错过了空格)
打开App,查看更多内容
随时随地看视频慕课网APP