2017-06-14 13 views
-2

1つのscanf関数で複数の変数を読み取るこの単純なプログラムを作成しようとしていますが、入力を入力した後に例外がスローされますか?アクセス違反書込み場所0x00D00000

編集:私は当初、scanf関数を使用しますが、それは安全でない可能性があるというエラーが発生します。スロー

例外:PROGRAM.EXEに0x52DAB87C(ucrtbased.dll)でスロー

例外:0xc0000005で:アクセス違反書き込み位置0x00D00000

#include <stdio.h> 
#include <stdlib.h> 


void main() 
{ 
    char name[20]; 
    int age; 
    char gender; 
    float income; 

    printf("Enter <name> <age> <gender> <income> :"); 
    scanf_s("%s %d %c %f", &name, &age, &gender, &income); 

    printf("Name : %s", name); 
    printf("Age : %d", age); 
    printf("Gender : %c", gender); 
    printf("Income : %.2f", income); 

    system("pause"); 
} 
+5

なぜC++タグを使用しますか?それはそれを修正 –

+3

わからない: '&NAME' =>' name'の –

+5

'scanf_s( "%sの%dの%Cは%fを"、&名、および年齢、および性別、および収入);' - > 'scanf_s("%19S% – BLUEPIXY

答えて

6

scanf/scanf_sから%s形式指定子は、ポインタを受け取りますcharの配列の最初の要素、つまりchar *に設定します。代わりに、配列のアドレスを渡しています。この場合はchar (*)[20]です。これらのタイプは互換性がありません。書式指定子に間違った型を渡すと、undefined behaviorが呼び出されます。代わりに&nameに渡すの

nameに渡します。関数に渡されると、配列は最初の要素へのポインタに減衰するので、これは適切な型です。

scanf_s("%19s %d %c %f", name, sizeof(name), &age, &gender, sizeof(gender), &income); 

はまた、それが配列の末尾を越えて書き込もうとしませんので、中に読み取ることができる文字数を制限し所定の長さ指定子を、注意してください。

関連する問題