1

複数の値を読み込むために使用しようとしてscanf_s()いますが、プログラムを実行するたびに

ラボ 2.exe の 0x592AD6AC (msvcr120d.dll) で未処理の例外: 0xC0000005: アクセス違反の書き込み場所 0x00000000。

ポップアップウィンドウで。これを修正するにはどうすればよいですか?

float inTemp;
char inUnit;
char outUnit;

printf("Please enter the starting temperature with its units and the units\nyou would like to convert to (i.e. 74.5 F C): ");
scanf_s("%f %c %c", &inTemp, &inUnit, &outUnit); //takes in all user input (NOT WORKING)
4

2 に答える 2

4

長さインジケータが指定されていません。MSDN から:

scanf および wscanf とは異なり、scanf_s および wscanf_s では、タイプ c、C、s、S、または [] で囲まれた文字列制御セットのすべての入力パラメーターに対してバッファー サイズを指定する必要があります。文字単位のバッファー サイズは、バッファーまたは変数へのポインターの直後に追加のパラメーターとして渡されます。たとえば、文字列を読み取る場合、その文字列のバッファ サイズは次のように渡されます。scanf_s("%9s", s, _countof(s)); // バッファサイズは 10、幅指定は 9

ここにそのページへのリンクがあります。

于 2014-08-07T01:31:16.040 に答える
2

scanf_sC11標準(n1570)、Annex K 3.5.3.2 p.4から(移植性が低い)を本当に使用したい場合:

この関数は、 、、および変換指定子が引数のペアに適用されることを除いて、fscanf_sと同等です(割り当ての抑制が によって示されている場合を除く)。これらの引数の最初の引数は、 for と同じです。この引数の直後に、引数リスト内で 2 番目の引数が続きます。これは型を持ち、ペアの最初の引数が指す配列内の要素数を示します。fscanfcs[*fscanfrsize_t

char *引数の長さを指定する必要があります。

scanf_s("%f %c %c", &inTemp, &inUnit, 1, &outUnit, 1);

または、次を使用しますscanf

scanf("%f %c %c", &inTemp, &inUnit, &outUnit);

そして、いつものように、戻り値を確認してください。

一般に、scanfちょっとした手っ取り早いプログラムには役立つこともありますが、エラーの処理が難しいため、生産的なソフトウェアにはあまり役に立ちません。fgets代わりにand sscanf/ strtod/ strtol/…を使用してください。

于 2014-08-07T01:39:50.943 に答える