首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何防止scanf在C中引起缓冲区溢出?

如何防止scanf在C中引起缓冲区溢出?
EN

Stack Overflow用户
提问于 2009-10-26 00:56:38
回答 4查看 112.4K关注 0票数 91

我使用以下代码:

代码语言:javascript
复制
while ( scanf("%s", buf) == 1 ){

防止缓冲区溢出的最好方法是什么,这样它就可以传递随机长度的字符串?

我知道我可以通过调用以下示例来限制输入字符串:

代码语言:javascript
复制
while ( scanf("%20s", buf) == 1 ){

但我更希望能够处理用户输入的任何内容。或者,不能使用scanf安全地完成此操作,而我应该使用fgets吗?

EN

回答 4

Stack Overflow用户

发布于 2009-10-26 01:59:50

大多数情况下,fgetssscanf的组合可以完成这项工作。另一件事是编写自己的解析器,如果输入格式良好的话。还要注意,您的第二个示例需要进行一些修改才能安全使用:

代码语言:javascript
复制
#define LENGTH          42
#define str(x)          # x
#define xstr(x)         str(x)

/* ... */ 
int nc = scanf("%"xstr(LENGTH)"[^\n]%*[^\n]", array); 

上面的代码丢弃输入流,但不包括换行符(\n)。您需要添加一个getchar()来使用它。还要检查你是否到达了流的末尾:

代码语言:javascript
复制
if (!feof(stdin)) { ...

仅此而已。

票数 8
EN

Stack Overflow用户

发布于 2009-10-26 01:04:28

直接使用scanf(3)及其变体会带来许多问题。通常,用户和非交互式用例是根据输入行来定义的。很少会出现这样的情况,如果没有找到足够的对象,更多的行就可以解决问题,但这是scanf的默认模式。(如果用户不知道在第一行输入数字,那么第二行和第三行可能不会有帮助。)

至少如果你fgets(3)你知道你的程序需要多少输入行,你就不会有任何缓冲区溢出……

票数 4
EN

Stack Overflow用户

发布于 2009-10-26 01:11:18

限制输入的长度肯定更容易。您可以通过使用循环接受任意长度的输入,一次读入一位,根据需要为字符串重新分配空间……

但这是大量的工作,所以大多数C程序员只是在任意长度上砍掉输入。我想您已经知道了这一点,但是使用fgets()不会允许您接受任意数量的文本-您仍然需要设置一个限制。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1621394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档