首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Unix下不能在C中工作

在Unix下不能在C中工作
EN

Stack Overflow用户
提问于 2013-04-23 14:08:51
回答 2查看 693关注 0票数 0

我试着用gets函数在Unix下用C语言输入一个字符串,但不起作用!

它显示以下警告:

代码语言:javascript
运行
复制
warning: the `gets' function is dangerous and should not be used.

如果我运行这个程序,我得不到输入域。代码是

代码语言:javascript
运行
复制
#include<stdio.h>

int main()
{
 int i;
 char ch,newfile[10],content[100];
 FILE *create;
 printf("Enter New File Name to Create : ");
 scanf("%s",newfile);
 create=fopen(newfile,"w+");
 printf("\nEnter Contents for %s : ",newfile);
 //fgets(content,sizeof content,stdin);
 //scanf("%s",&content);
 //gets(content);
 for(i=0;i<100;i++)
 {
   if(content[i]!='\0')
   {
    ch=content[i];
    putc(ch,create);
   }
 else
   break;
 }
 printf("\nYour File Is Created\n");

 return 0;
} 

有人好心帮我解决这个问题。我已经评论了我尝试过的所有可能性。谢谢!

EN

回答 2

Stack Overflow用户

发布于 2013-04-23 14:14:37

原始scanf("%s")和gets()一样危险(两者都暴露在缓冲区溢出中)。您应该改用fgets(),因为它限制了字符串的长度。

gets()和fgets()之间的另一个区别是后者将'\n'放在字符串中,虽然乍一看很烦人,但它允许您查看行是否被截断。你应该做的是:

  • 使用fgets()
  • 查找它所在的缓冲区,然后这一行足够小,可以放入缓冲区。只需用'\0'替换'\n'就可以了。
  • 如果它不存在,则用户键入了比缓冲区更长的行。这取决于情况,你对此是否可以接受。但在这两种情况下,您都必须在下一次输入之前完成读取行(要么读入新缓冲区,要么简单地在循环中调用getchar(),直到获得'\n'EOF)。
票数 5
EN

Stack Overflow用户

发布于 2013-04-23 14:17:33

第一个scanf不使用行尾字符--您可以通过输入"foo bar“作为文件名来研究这一点。

下一行的格式应为scanf("\n%99s", content); -注意前面的'\n‘以读取换行符,并注意防护符99以防止缓冲区溢出。不幸的是,如果输入"foo bar“作为文件名,这种方法不足以产生预期的结果。与直觉相反的是,“bar”被读取为内容。

最后,gets遇到了与前面的问题相同的问题。(+主要问题是,它没有防止缓冲区溢出。)

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

https://stackoverflow.com/questions/16162161

复制
相关文章

相似问题

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