0

関数を使用して Unix で C 言語に文字列を入力しようとしていますが、うまくいきgetsません!

次の警告が表示されます。

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()代わりに、文字列の長さを制限するを使用する必要があります。

gets() と fgets() のもう 1 つの違いは、後者'\n'では文字列に the が含まれていることです。これは一見面倒ですが、行が切り捨てられたかどうかを確認できます。あなたがすべきことは次のとおりです。

  • fgets() を使用する
  • を求める'\n'
  • 存在する場合、行はバッファーに収まるほど十分に小さかった。'\n'を aに置き換えるだけで'\0'、あなたはゴールデンです。
  • 存在しない場合、ユーザーはバッファーよりも長い行を入力しました。状況に応じて、これで問題ない場合もあります。ただし、どちらの場合も、次の入力の前に行の読み取りを終了する必要があります (新しいバッファーに入れるか、単にorgetchar()を取得するまでループを呼び出すことによって)。'\n'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 に答える