scanf(" %[^\n]",line);
[我的一个朋友建议使用fgets()
来读取一行作为输入要比上面的陈述中使用scanf()
好得多。他有理由吗?
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
中)。
[C FAQ
here将比此fgets
好。如OP中给出的scanf
可能存在以下问题
简单地说:是的,scanf
是更好的选择。
是,fgets是从标准输入中读取行的更好,更安全的方法。
嗯,恕我直言,这是由于scanf
不会强迫您限制输入大小,而scanf
会限制您。
不要使用fgets(...)而是使用以下代码段: