在大多数操作系统中,用户输入默认是基于行的。这样做的原因之一是允许用户在将输入发送到程序之前按退格键来更正输入。
对于基于行的用户输入,程序一次读取一行输入是有意义且直观的。这就是该函数的fgets作用(前提是缓冲区足够大以存储整行输入)。
scanf另一方面,该函数通常不会一次读取一行输入。例如,当您将%sor%d转换格式说明符与 一起使用时scanf,它不会消耗整行输入。相反,它只会消耗与转换格式说明符匹配的输入量。这意味着行尾的换行符通常不会被消耗(这很容易导致编程错误)。此外,scanf使用%d转换格式说明符调用将考虑输入,例如6sldf23dsfh2number 的有效输入6,但scanf使用相同说明符的任何进一步调用都将失败,除非您从输入流中丢弃该行的其余部分。
在处理基于行的用户输入时,的这种行为scanf是反直觉的,而 的行为是直观的。fgets
使用 后fgets,您可以在字符串上使用该函数sscanf,以解析单个行的内容。这将允许您继续使用扫描集。或者您可以通过其他方式解析该行。无论哪种方式,只要您使用fgets而不是scanf读取输入,您将一次处理一行输入,这是处理基于行的用户输入的自然且直观的方式。
当我们使用
fgets如果用户输入的字符超过边界(我的意思是很多字符)时会发生什么,是否会导致缓冲区溢出?那么该如何处理呢?
如果用户输入的字符数量超出了第二个函数参数指定的缓冲区的容纳范围fgets,则不会溢出缓冲区。相反,它只会从输入流中提取适合缓冲区的字符数。'\n'您可以通过检查字符串末尾是否包含换行符来确定是否读取整行。