2014-09-10 50 views
0

在下面的代碼:爲什麼scanf函數掃描一個空值

#include <stdio.h> 

int main(){ 

    char *name; 
    int age; 
    char *gen; 

    printf("Your name:"); 
    scanf("%s",name); 

    printf("Your age:"); 
    scanf("%d",&age); 

    printf("Your gender:"); 
    scanf("%s",gen); 

    printf("*****************\n"); 

    printf("%s is a %d years old %s \n",name,age,gen); 

    return 0; 

} 

當我運行它像這樣:

Your name:tom 
Your age:20 
Your gender:male 
***************** 
tom is a 20 years old (null) 

正如你所看到的,根是一個空值,爲什麼scanf失敗閱讀進入gen但前兩個閱讀成功?

+1

所以不是字符*名稱使用字符名稱[20]和char gen [20] – Rob 2014-09-10 12:40:33

+0

@Rob爲什麼'name'沒有分配內存,但是'gen'沒有? – user3289218 2014-09-10 12:54:22

+2

@ user3289218「運氣」。未定義行爲的最嚴重症狀。 – Quentin 2014-09-10 12:55:12

回答

5
char *name; 
char *gen; 

只是字符指針而沒有指向任何東西。所以需要爲它分配內存。

你可以爲它分配內存像

char *name = malloc(100); 
char *gen = malloc(100); 

或定義與預定長度

char name[100]; 
char gen[100]; 
+0

你打我:) – Rob 2014-09-10 12:39:19

+1

你的意思是我需要指定char數組的長度,比如'char name [10]'? – user3289218 2014-09-10 12:41:02

+1

爲什麼名稱指針工作,然後,我試着交換scanf來先讀取gen,然後名稱字符串變爲空。 – Haris 2014-09-10 12:41:53

1
char *name; 
char *gen; 

正在指針,你需要要麼改變數組字符數組

char name[256];//256 is arbitrary ofc 
char gen[256]; 

或分配內存wi TH指針:

char *name = malloc(256 * sizeof(*name)); 
char *gen = malloc(256 * sizeof(*gen)); 

請注意,如果您分配使用malloc內存,它是一個很好的習慣中,以檢查是否分配失敗:

if (name == NULL) 
    return -1; 
+2

無需輸入「 malloc'和'sizeof(char)'總是'1'。所以不需要它。 – 2014-09-10 12:43:22

+0

我認爲這是一個投入malloc結果的習慣,sizeof在這裏也不需要,但對於其他任何東西,因爲OP似乎對C來說是新的,所以我不想混淆他。但我會編輯更多的解釋 – mantal 2014-09-10 12:45:13

+0

但爲什麼我必須先爲它分配內存? – user3289218 2014-09-10 12:47:00

相關問題