2017-06-14 95 views
-2

我想寫這個簡單的程序,它在一個scanf函數中讀取多個變量,但輸入輸入後會引發異常?訪問衝突寫入位置0x00D00000

編輯:我最初使用scanf,但它會導致錯誤,說它可能是不安全的。

拋出異常:

異常在0x52DAB87C(ucrtbased.dll)中的Program.exe拋出:0000005:訪問衝突寫入位置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++標籤? – 2017-06-14 13:08:41

+3

不確定是否修正了它:'&name' =>'name' –

+5

'scanf_s(「%s%d%c%f」,&name,&age,&gender,&income);' - >'scanf_s(「%19s% d%c%f「,name,20,&age,&gender,1,&income);' – BLUEPIXY

回答

6

%s格式說明scanf/scanf_s期望一個指針到char數組的第一個元素,即一個char *。相反,您傳遞的是數組的地址,在這種情況下爲char (*)[20]。這些類型不兼容。傳遞格式說明符的錯誤類型將調用undefined behavior

代替傳入&name,傳入name。當傳遞給一個函數時,數組會衰減到指向第一個元素的指針,所以這是正確的類型。

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

還要注意給出的長度說明符,這限制了可以在因此它不嘗試寫過去陣列的端部被讀取的字符數。