我被告知当用户输入字符串时,不应使用scanf。大多数专家和StackOverflow上的用户都建议使用gets()。我从未在StackOverflow上询问过为什么不应该使用scanf来处理字符串。这不是实际问题,但非常感谢能回答这个问题。
现在进入实际问题。我遇到了这种类型的代码-
scanf("%[^\n]s",a);
这段代码会读取用户输入的字符串,直到检测到换行符为止,并将空格也视为字符串中的一部分。
如果我使用
,会有什么问题吗?scanf("%[^\n]s",a);
gets函数的替代方案是什么?
相比之下,gets函数是否比scanf函数更优化,因为gets函数专门用于处理字符串。 请告诉我这个问题的答案。
更新
这个链接帮助我更好地理解了它。
gets
也不是一个很好的选择,因为存在缓冲区溢出的风险。请使用fgets
。 - Etienne de Martelstdin
作为最后一个参数传递,您可以使用fgets
从标准输入读取内容。与gets
相比,使用fgets
的优点在于您可以指定缓冲区的长度,从而防止fgets
读取过多的数据。由于存在向后兼容性原因,未修复gets
中的安全风险。 - Etienne de Martelf*
函数(比如说,fscanf
)都可以用于stdin
文件句柄来模拟非f*
版本(在这种情况下,fscanf(stdin, ...)
与scanf(...)
完全等效)。 - Chris Lutzstdin
读取将始终等待换行符。但是,如果用户输入的字符数超过了fgets
要求的数量,它们将作为FILE *
结构的一部分存储在缓冲区中,您无法访问它们。对fgets
的第二次调用,不会读取更多用户输入,而是返回该缓冲区中的更多数据,直到其为空。(fgetc
和其他逐个字符函数也是这样做的。) - Chris Lutz