0

私は何かを試したと思います(標準入力のフラッシュ、改行を消費するためのscanfなど)が、期待どおりに何も機能しません。次のコードでは、何らかの理由で、3 番目の scanf が 2 番目の scanf の変数を変更します。

#include <stdio.h>

int main()
{
  char first_name[16], last_name[21];
  char filename[11];
  FILE *opening;

  printf("The program saves your first and last name into a file.\n");

  printf("Enter your first name:");
  scanf("%s", first_name);
  getchar();

  printf("Enter your last name:");
  scanf(" %s", last_name);
  getchar();

  printf("File where you want to save your name:");
  scanf(" %s", filename);

  opening = fopen(filename, "wb");

  fprintf(opening, "%s %s", first_name, last_name);
  printf("\nSuccessfully saved the data!");

  fclose(opening);

  return 0;
}

出力:

The program saves your first and last name into a file.
Enter your first name: John
Enter your last name: Doe
File where you want to save your name: filename.txt

Successfully saved the data!

filename.txt の内容が次のとおりであることを除いて、すべて問題なくダンディです。

ジョン・t

「t」文字は何らかの形で「txt」から来ていると推測していますが、C の学習を始めたばかりで、このコードを修正する方法がわかりません。教祖が私を助けてくれませんか?

4

3 に答える 3

1

バッファfilenameが小さすぎます。

と書くfilename.txtと、12 文字にゼロを加えて 13 になります。11 だけを割り当てます。次のように試してください。

char filename[20];

そしてそれはうまくいくはずです。

scanfただし、 を使用すると、非常に厄介な問題が発生する可能性があることに注意してください。正しいメモリ処理の重要性を示しているため、C の実験と学習に適しています。実際のプロジェクトでは、さまざまな機能やフレームワークの使用を検討する必要があります。

于 2013-09-16T15:29:49.780 に答える
0

ファイル名として filename.txt を入力している場合、.txt のバッファをオーバーランしていますfilename。これは未定義の動作であり、奇妙な結果の原因です。

修正するには、char filename[11];大きくして、NULL ターミネータに 1 文字余分に許可することを忘れないでください。あなたの非常に具体的なケースでは、それはあなたの呼び出しchar filename[14];の前に誤ったスペースを許すでしょう.%sscanf

それ以外の場合は、すべて問題ないように見えます。

于 2013-09-16T15:29:14.300 に答える
0

バッファがメモリを提供するよりも多くのデータをバッファに読み込む可能性があるため、文字列での使用scanf()は危険です。

文字列をスキャンする場合scanf()、 に渡される形式にこの数値を追加することにより、読み取る文字数を常に通知する必要がありますscanf()

char file_name[11];

...

scanf("%10s", file_name); /* As file_name provides memor for 11 characters, read a
                             maximum of 10 characters into file_name leaving 1 
                             character room for the necessary `0-`terminator indicating 
                             the end of the "string". */

fopenまた、コードはシステムコールのエラーチェックを欠いています。

次のようなことをしたほうがいいです:

opening = fopen(filename, "wb");
if (NULL == opening)
{
  perror("fopen() failed");
  exit(EXIT_FAILURE);
}
于 2013-09-16T15:30:28.810 に答える