2016-06-08 58 views
0

我遇到了scanf()函數的問題。當我編譯並運行此代碼C:scanf()函數不工作,因爲它應該

 int ID; 
     char* name = NULL; 
     char sex; 
     float quiz1; 
     float quiz2; 
     float midscore; 
     float finalscore; 
     float totalscore; 

     printf("please enter the student information.\n"); 
     printf("ID: "); 
     scanf("%i", &ID); 
     printf("Name: "); 
     scanf(" %s", name); 
     printf("Sex: "); 
     scanf(" %c", &sex); 
     printf("Quiz mark(first semester): "); 
     scanf(" %f", &quiz1); 
     printf("Quiz mark(second semester): "); 
     scanf(" %f", &quiz2); 
     printf("Mid-term score: "); 
     scanf(" %f", &midscore); 
     printf("Final score: "); 
     scanf(" %f", &finalscore); 
     printf("Total score: "); 
     scanf(" %f", &totalscore); 

我得到的是:

ID:5
名:Alex
性別:測驗標誌(第一學期):測驗標誌(第二學期) :中期得分:最終得分:總得分:

有人能解釋我發生了什麼事嗎?

+0

當調用'scanf()'函數族時,總是檢查返回值(而不是參數值)以確保操作成功。當使用'%s'輸入/轉換說明符時,請始終使用比輸入緩衝區長度小1的'最大長度'修飾符,以便用戶不能超出輸入緩衝區。請記住,這些輸入中的每一個都是用一個換行字符序列結尾的。 '%s'在處理空白方面存在問題。並且'%c'將從前一個輸入中輸入換行符,這些中的每一個都可以通過使用格式字符串中的前導空格來修復。例如, – user3629249

回答

2

在的

scanf(" %s", name); 

name點是NULL(即,它指向無效的內存位置),並使用該作爲參數調用%sundefined behavior

您需要先分配內存到name,然後才能使用它來保存輸入。

+0

聲明它爲'char name [100];' – infixed

+0

@以這種方式定義,'name'將不再是指針,但你也是正確的。 –

+0

我通常在詞彙上認爲'name'與'&name [0]'是一樣的,因此它仍然是一個指針。而不是一個指針變量_variable_你不能通過使用它作爲左值來重新綁定它,但仍然可以使用一個指針作爲右值 – infixed

0

這裏的問題是:

char* name = NULL; 

你需要寫任何數據之前分配一些內存的指針。您可以靜態或動態分配一些空間:

char name[10]; 
char *name2; 
name2 = malloc(10*sizeof(char)); 
相關問題