簡體   English   中英

在Unix下無法在C中工作

[英]gets not working in C under Unix

我正在嘗試使用gets函數在Unix下以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;
} 

有人請幫助我。 我已經評論了我嘗試過的所有可能性。 謝謝!

raw scanf("%s")和gets()一樣危險(兩者都暴露於緩沖區溢出中)。 您應該改用fgets()來限制字符串的長度。

gets()和fgets()之間的另一個區別是后者將'\\n'放入字符串中,乍一看雖然令人討厭,但您可以查看該行是否被截斷。 您應該做的是:

  • 使用fgets()
  • 搜尋'\\n'
  • 如果存在,則該行足夠小以適合緩沖區。 只需將'\\n'替換為'\\0'就可以了。
  • 如果不存在,則用戶鍵入的行長於緩沖區。 根據情況,您對此是否滿意。 但是在兩種情況下,您都必須在下一次輸入之前完成讀入該行(或者讀入新緩沖區,或者簡單地通過循環調用getchar()直到獲得'\\n'EOF )。

第一個scanf不會占用行尾字符-您可以通過輸入“ foo bar”作為文件名來進行研究。

下一行的格式應為scanf("\\n%99s", content); -注意前面的'\\ n'以讀取換行符,並注意保護99,以防止緩沖區溢出。 仍然不幸的是,如果一個方法鍵入“ foo bar”作為文件名,這種方法不足以產生預期的結果。 違反直覺的“條”被視為內容。

最后, gets與先前的遭受相同的問題。 (主要問題是,它沒有防止緩沖區溢出的措施。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM