gpt4 book ai didi

c - 我应该在 c 中使用有限输入的 fgets 还是 scanf?

转载 作者:行者123 更新时间:2023-12-05 08:46:13 25 4
gpt4 key购买 nike

我应该使用 fgets 还是像 scanf("%10s", foo) 这样格式化的 scanf

除了 scanf 不读取空白字符,这可以解决并用 scanset 做更多的事情,那么为什么我应该使用 fgets 而不是 scanf?

如有任何帮助,我们将不胜感激。


编辑

我还想问的一件事是:即使我们使用 fgets 如果用户输入的字符超过边界(我的意思是很多字符)会发生什么情况,是否会导致缓冲区溢出?那怎么处理呢?

最佳答案

在大多数操作系统上,默认情况下,用户输入是基于行的。这样做的原因之一是允许用户在将输入发送到程序之前按退格键来更正输入。

对于基于行的用户输入,程序一次读取一行输入是有意义且直观的。这是什么函数 fgets 确实如此(前提是缓冲区足够大以存储整行输入)。

函数 scanf ,另一方面,通常不会一次读取一行输入。例如,当您使用 %s%d带有 scanf 的转换格式说明符,它不会消耗整行输入。相反,它只会消耗与转换格式说明符匹配的输入。这意味着行尾的换行符通常不会被消耗 ( which can easily lead to programming bugs )。另外,scanf%d 调用转换格式说明符将考虑输入,例如 6sldf23dsfh2作为数字 6 的有效输入, 但任何进一步调用 scanf使用相同的说明符将失败,除非您从输入流中丢弃该行的其余部分。

scanf 的这种行为是违反直觉的,而 fgets 的行为在处理基于行的用户输入时是直观的。

使用后fgets , 你可以使用函数 sscanf 在字符串上,用于解析单个行的内容。这将允许您继续使用扫描集。或者您可以通过其他方式解析该行。无论哪种方式,只要您使用 fgets而不是 scanf对于读取输入,您将一次处理一行输入,这是处理基于行的用户输入的自然而直观的方式。

When we use fgets what happen if user enter characters more than boundary (I mean a lot of characters), does it lead to buffer overflow? Then how to deal with it?

如果用户输入的字符多于第二个 fgets 指定的缓冲区中的字符数函数参数,则它不会溢出缓冲区。相反,它只会从输入流中提取适合缓冲区的尽可能多的字符。您可以通过检查字符串是否包含换行符来确定是否整行被读取 '\n'在最后。

关于c - 我应该在 c 中使用有限输入的 fgets 还是 scanf?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70082149/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com