0

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

它显示以下警告:

warning: the `gets' function is dangerous and should not be used.

如果我运行程序,我没有得到输入字段。代码是

#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;
} 

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

4

2 回答 2

5

rawscanf("%s")与 gets() 一样危险(两者都暴露于缓冲区溢出)。您应该改用fgets()它,这会限制字符串的长度。

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

  • 使用 fgets()
  • 寻求'\n'
  • 如果存在,则该线足够小以适合缓冲区。只需将 a 替换为'\n'a'\0'即可。
  • 如果不存在,则用户键入的行长于缓冲区。根据情况,您对此是否满意。但在这两种情况下,您都必须在下一次输入之前完成对行的读取(要么进入新缓冲区,要么简单地通过getchar()循环调用,直到获得'\n'or )。EOF
于 2013-04-23T06:14:36.820 回答
1

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

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

最后,gets遭受与以前相同的问题。(+主要问题,它没有防止缓冲区溢出。)

于 2013-04-23T06:17:33.390 回答