gets和scanf有什么区别?

Shi*_*ang 10 c gets scanf

如果代码是

scanf("%s\n",message)  
Run Code Online (Sandbox Code Playgroud)

VS

gets(message)
Run Code Online (Sandbox Code Playgroud)

有什么区别?似乎他们都得到了消息的输入.

Sou*_*osh 17

[参考你的特定情况]的基本区别,

  • scanf()在遇到a时结束输入whitespace,newlineEOF

  • gets()将空格视为输入字符串的一部分,并在遇到newline或时结束输入EOF.

但是,为避免缓冲区溢出错误并避免安全风险,使用起来更安全fgets().


alk*_*alk 8

消除歧义:在以下情况下,如果在正确使用时不会导致麻烦,我会认为" 安全 ".和" 不安全 "如果"unsafetyness"不能操纵左右.

scanf("%s\n",message)
Run Code Online (Sandbox Code Playgroud)

VS

gets(message)
Run Code Online (Sandbox Code Playgroud)

有什么不同?

在安全性方面没有区别,如果用户输入更多数据然后提供内存,则读入Standard Input和可能很好地溢出.messagemessage

scanf()通过指定要扫描的最大数据量,您可以安全地使用它:

char message[42];

...

scanf("%41s", message); /* Only read in one few then the buffer (messega here) 
                           provides as one byte is necessary to store the 
                           C-"string"'s 0-terminator. */
Run Code Online (Sandbox Code Playgroud)

有了gets()不是可以指定字符的最大数量来读,这就是为什么后者不得使用!


Lun*_*din 5

主要区别在于gets读取直到 EOF 或\n,而scanf("%s")读取直到遇到任何空格。scanf还提供了更多的格式化选项,但同时它的类型安全性比gets.

另一个很大的区别是它scanf是一个标准的 C 函数,虽然gets已从语言中删除,因为它既多余又危险:没有防止缓冲区溢出的保护。但是, scanf 存在相同的安全漏洞,因此这两个函数都不应在生产代码中使用

您应该始终使用fgets,C 标准本身甚至建议这样做,请参阅 C11 K.3.5.4.1

推荐做法

6 fgets 函数允许正确编写的程序安全地处理太长而无法存储在结果数组中的输入行。通常,这要求 fgets 的调用者注意结果数组中是否存在换行符。 考虑使用 fgets(以及基于换行符的任何所需处理)而不是 get_s。

(强调我的)

  • 注意:`scanf("%s")` 读入并丢弃任何前导空白,_then_ 扫描并保存非空白直到后续的空白或 `EOF`。 (2认同)