我使用以下代码:
while ( scanf("%s", buf) == 1 ){
防止缓冲区溢出的最好方法是什么,这样它就可以传递随机长度的字符串?
我知道我可以通过调用以下示例来限制输入字符串:
while ( scanf("%20s", buf) == 1 ){
但我更希望能够处理用户输入的任何内容。或者,不能使用scanf安全地完成此操作,而我应该使用fgets吗?
发布于 2009-10-26 01:59:50
大多数情况下,fgets
和sscanf
的组合可以完成这项工作。另一件事是编写自己的解析器,如果输入格式良好的话。还要注意,您的第二个示例需要进行一些修改才能安全使用:
#define LENGTH 42
#define str(x) # x
#define xstr(x) str(x)
/* ... */
int nc = scanf("%"xstr(LENGTH)"[^\n]%*[^\n]", array);
上面的代码丢弃输入流,但不包括换行符(\n
)。您需要添加一个getchar()
来使用它。还要检查你是否到达了流的末尾:
if (!feof(stdin)) { ...
仅此而已。
发布于 2009-10-26 01:04:28
直接使用scanf(3)
及其变体会带来许多问题。通常,用户和非交互式用例是根据输入行来定义的。很少会出现这样的情况,如果没有找到足够的对象,更多的行就可以解决问题,但这是scanf的默认模式。(如果用户不知道在第一行输入数字,那么第二行和第三行可能不会有帮助。)
至少如果你fgets(3)
你知道你的程序需要多少输入行,你就不会有任何缓冲区溢出……
发布于 2009-10-26 01:11:18
限制输入的长度肯定更容易。您可以通过使用循环接受任意长度的输入,一次读入一位,根据需要为字符串重新分配空间……
但这是大量的工作,所以大多数C程序员只是在任意长度上砍掉输入。我想您已经知道了这一点,但是使用fgets()不会允许您接受任意数量的文本-您仍然需要设置一个限制。
https://stackoverflow.com/questions/1621394
复制相似问题