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

问题描述 投票:16回答:7
scanf(" %[^\n]",line);

[我的一个朋友建议使用fgets()来读取一行作为输入要比上面的陈述中使用scanf()好得多。他有理由吗?

c scanf stdio
7个回答
21
投票

char * fgets ( char * str, int num, FILE * stream );是安全使用的,因为它避免了char * fgets ( char * str, int num, FILE * stream );问题,它仅扫描buffer overflow个字符。

[从流中读取字符并将它们作为C字符串存储到str中,直到已读取(num-1)个字符或到达换行符或到达文件末尾,以先发生的为准。

这里第二个参数num-1是要复制到str中的最大字符数(包括终止的空字符)。

例如,假设您的代码中的字符串数组容量仅为num个字符,如下所示。

5

使用上面的代码,如果来自 char str[5]; fgets (str, 5, fp); //5 =you have provision to avoid buffer overrun 的输入比fp字符更长,则4只会先读取fgets()个字符,然后追加4,并丢弃其他多余的输入字符,只存储5个\0中的char)。

str[]将读取直到找不到scanf(" %[^\n]",str);,并且如果输入字符串更长,则\n字符4将导致scanf()(因为buffer overflow将尝试访问最大索引scanf以外的内存)在4中)。


8
投票

[C FAQ


3
投票

here将比此fgets好。如OP中给出的scanf可能存在以下问题


3
投票

简单地说:是的,scanf是更好的选择。


3
投票

是,fgets是从标准输入中读取行的更好,更安全的方法。


0
投票

嗯,恕我直言,这是由于scanf不会强迫您限制输入大小,而scanf会限制您。


-1
投票

不要使用fgets(...)而是使用以下代码段:

© www.soinside.com 2019 - 2024. All rights reserved.