【发布时间】:2011-12-31 22:35:43
【问题描述】:
有人告诉我,用户输入字符串时不应使用 scanf。相反,大多数专家以及 StackOverflow 上的用户都使用 gets()。我从来没有在 StackOverflow 上问过它为什么不应该使用 scanf 来获取字符串。这不是实际问题,但非常感谢您回答这个问题。
现在进入实际问题。我遇到了这种类型的代码-
scanf("%[^\n]s",a);
这会读取一个字符串,直到用户输入一个换行符,同时将空格视为字符串。
如果我使用有什么问题
scanf("%[^\n]s",a);
而不是获取?
Is 比 scanf 函数听起来更优化,gets 纯粹专用于处理字符串。请让我知道这件事。
更新
This 链接帮助我更好地理解它。
【问题讨论】:
-
gets也不是一个好主意,因为存在缓冲区溢出的风险。使用fgets。 -
@etiennedeMartel 谢谢,但据我所知 fgets 是用于文件处理的,对吗?我刚刚了解到 f 表示文件模式,所以他们为什么要使用 get 和 fgets()
-
您可以通过将
stdin作为最后一个参数从标准输入中读取fgets。使用fgets优于gets的优势在于,使用fgets,您可以指定缓冲区的长度,防止fgets读取太多 数据。gets存在安全风险,出于向后兼容性的原因,他们从未修复它。 -
@niko - 任何
f*函数(比如fscanf)都可以在stdin文件句柄上使用,以模拟非f*版本(在这种情况下,fscanf(stdin, ...)是完全等同于scanf(...))。 -
@niko - 不,从
stdin读取将始终等待换行符。但是,如果用户输入的字符多于fgets所要求的字符,它们将作为FILE *结构的一部分存储在缓冲区中,并且不会被您访问。第二次调用fgets将不再读取更多用户输入,而是从该缓冲区返回更多数据,直到它为空。 (fgetc其他一次一个字符的函数做同样的事情。)