2016-01-25 25 views
2

我的代碼有問題。實際上當編譯器執行以下行時Scanf_s錯誤與陣列

scanf_s("%c", macchina[i].marca, 50); 

Visual Studio讓我這個錯誤。它給了我與函數get_s相同的問題。

我不明白什麼是錯的代碼。感謝您的支持

這是我的代碼

#include <stdio.h> 

int main(void) { 

    struct automobile{ 
     char *marca; 
     int modello; 
     int vendute; 
    }; 

    struct automobile macchina[5]; 

    for (int i = 0; i < 5; i++){ 
     printf("Inserisci marca: "); 
     scanf_s("%c", macchina[i].marca, 50); 
    } 
} 

回答

1

你的情況的問題是,你沒有分配內存以macchina[i].marca

作爲一個單位指針,它指向一些隨機內存位置,可能無法從您的應用程序訪問。因此,該位置幾乎是無效

訪問無效內存調用undefined behavior

爲了解決:要麼

  1. 定義marca是一個數組,像char marca[50];或同樣

  2. 分配使用之前,使用malloc()或家庭動態存儲器。

這就是說,你應該格式說明更改爲%s掃描。如果沒有寬度說明符,%c只需要一個char

+0

值得注意的是,'scanf'格式字符串也是錯誤的; '%c' - >'%s'。 – szczurcio

+0

我注意到了,但是我只是爲了試試它,然後我忘了回去(即使%s也不工作) – Amarildo

+0

因此我必須在** marca **上分配內存? – Amarildo

0

macchina[i].marca是一個單位指針。如果不分配內存,則無法讀取它。

既然你想讀50字符到它,你可能需要使用%s(C-字符串)和結構的定義修改爲:

struct automobile{ 
     char marca[50]; 
     int modello; 
     int vendute; 
    }; 

,並呼籲scan_f()爲:

scanf_s("%s", macchina[i].marca, sizeof(macchina[i].marca)); 

如果要將尺寸設置爲動態,則需要使用malloc()

0
macchina[i].marca 

是未初始化的char指針。你需要分配內存來指向它,或者你可以使用數組。

E.g.要使用一個能夠容納50個字符的數組,請將此代碼更改爲:

#include <stdio.h> 

int main(void) { 

    struct automobile{ 
     char marca[51]; // 50 chars + '\0' terminator 
     int modello; 
     int vendute; 
    }; 

    struct automobile macchina[5]; 

    for (int i = 0; i < 5; i++){ 
     printf("Inserisci marca: "); 
     scanf_s("%s", macchina[i].marca, 50); // %c is only for reading single char values, use %s for strings. 
    } 
}