-1

fseekとfseekの値0Lは、この値の意味もseek_endの意味であり、EOF ctrl+zが機能していない場合にも役立ちます。

void modify()
{
 int ch1;
 FILE *f1;
 char c,*word,*sent,fname[20];
 printf("Enter the filename to be modified: ");
 scanf("%s",fname);
 if(searchpath(fname))
    {
    printf("\n1.Character");
    printf("\n2.Word");
    printf("\n3.Sentence");
    printf("\nEnter U'r choice: ");
    scanf("%d",&ch1);
    if(ch1==1)
       {
       f1=fopen(fname,"a+");//use to search the fiel in path variables
       fseek(f1, 0L, SEEK_END);
       printf("Enter the character and CTRL+Z to exit:\n ");
       while((c=getchar())!=EOF)
          {
          putc(c,f1);
          }
       }
    else if(ch1==2)
       {
       printf("Enter the word: ");
       scanf("%s",word);
       f1=fopen(fname,"a+");
       fseek(f1, 0L, SEEK_END);
       fputs(word,f1);
       }
    else
       {
       printf("Enter the sentence and CTRL+Z to exit: ");
       f1=fopen(fname,"a+");
       fseek(f1, 0L, SEEK_END);
       while((c=getchar())!=EOF)
         {
         putc(c,f1);
         }
       }
    }
 else
 printf("\nFilename does not exist");
 fclose(f1);
 }

コードを実行してprintf( "文字を入力し、CTRL + Zで終了します:\ n");を呼び出すと while((c = getchar())!= EOF){putc(c、f1); }そして、ctrl+をクリックすると、 z->矢印マークを付けて入力すると、fflush(stdin);を使用して無限ループに到達します。ファイルのアドレスを失い、ガベージアドレスを取得しました。

4

1 に答える 1

1

いくつか問題がありますが、大きな問題は最後まで取っておきます。

まず、無限ループが の使用方法に起因する可能性がありますgetchar

getcharstdin から読み取った文字の値を返します。エラーまたはファイルの終わりの場合は、EOF (プラットフォームに依存する値ですが、通常は -1) を返します。ただし、ファイルの終わり (プラットフォームによって異なる可能性があります) が実際に発生するのは、プログラムを呼び出すときにファイルを stdin にリダイレクトした場合、つまり、終了できるファイルがある場合のみです。

一部のプラットフォームでは、CTRL-Z は CTRL-D と同様にファイルの終わりとして解釈される場合がありますが、これは確かに普遍的ではなく、どちらについてもよくわかりません。

CTRL-Z がファイルの終わりとして解釈されない場合、2 つの結果が考えられます。1 つは、プログラムを強制的に中断することです。これは、Windows コマンド プロンプトの CTRL-Break に少し似ています。もう 1 つは、CTRL-Z が他のキーと同じようにキー押下として扱われ、おそらく文字コード 26 が から返されることgetcharです。

次に、オープンモードが「a +」であるため、fseek はまったく必要ないと思いますが、私には間違っているようには見えませんが、C を十分に使用していないため、これ以上確認することはできません。

最後に、scanf の使用方法にも深刻な問題があると思います。これにより、深刻な未定義の動作が引き起こされます。次の行を取ります...

scanf("%s",word);

あなたの変数wordは次のように定義されています...

char c,*word,*sent,fname[20];

OK、それは文字へのポインタですが、そのポインタは初期化されていません。入力テキストを保持するメモリ バッファーが必要であり、ポインターを初期化する必要があります。通常、次のようwordな文字の配列として宣言する方が簡単です...

char word [100];

これにより、結果の文字列を保持するために使用できるメモリが確保されますが、メモリ バッファーが十分に大きいという保証はありません。この点は、実際のプログラミングにとっては重大な点ですが、現時点ではおそらく心配する必要はありません。

奇妙なのは、この問題を既に解決しているように見えることですfname。これは、問題を理解せずにコードを修正するために人々の提案を自動的に適用している可能性があることを示唆しており、これは少し心配です. したがって、警告を表示します - 現在は を使用していないようですが、および とsent同じように使用することを意図している場合は、同じ問題が発生します。wordfnameword

于 2011-12-05T00:23:15.990 に答える