2017-06-23 104 views
1

我正在修改我的基本C爲即將到來的測驗做準備,當時我正在編寫一個函數來簡單地接受一個字符輸入並將其存儲到結構中並再次打印出來。編譯沒有任何問題,但我不斷收到合理的問題。我該如何解決?printf和scanf的邏輯問題

#include <stdio.h> 

struct player 
{ 
    char letter; 
    int age; 
    double avg; 
}; 

int main() 
{ 
    struct player P1; 
    char name; 
    int age; 
    double avg; 
    printf("Enter age: "); 
    scanf("%d", &age); 
    printf("Enter avg: "); 
    scanf("%lf", &avg); 
    printf("Enter name: "); 
    scanf("%s", &name); 

    P1.letter= name; 
    P1.avg = avg; 
    P1.age = age; 
    printf("\n Age is: %d \n", P1.age); 
    printf("Avg is: %lf", P1.avg); 
    printf(" \n Name is: %c \n", P1.letter); 
    return 0; 
} 

如果我把「1」,INT,輸出將是「年齡是:0'

+0

'的scanf( 「%S」,&name);'=>'的scanf( 「%C」,&name);'' – Stargateur

+2

scanf的(」 %s「,&name);' - 您應該[閱讀'%s'格式說明符的要求。](http://en.cppreference.com/w/c/io/fscanf)。您沒有提供適當的金額用於讀取名稱字符串的空間 – WhozCraig

+0

良好的舊緩衝區溢出永遠不會寫入長度未知的C字符串從不 –

回答

0

你試圖讓姓名,年齡和平均的球員,這樣存儲的名字,你應該聲明數組不是性格和分配名稱結構變量使用的strcpy()(直接分配不工作),或者如果你只取一個字符的名稱,然後寫scanf函數是這樣的:。

scanf("%c", &name); 

查看下面的代碼,它會幫助你,

#include <stdio.h> 

struct player 
{ 
    char letter[10]; 
    int age; 
    double avg; 
}; 

int main() 
{ 
    struct player P1; 
    char name[10]; 
    int age; 
    double avg; 
    printf("Enter age: "); 
    scanf("%d", &age); 
    printf("Enter avg: "); 
    scanf("%lf", &avg); 
    printf("Enter name: "); 
    scanf("%s", &name); 

    strcpy(P1.letter,name); 
    P1.avg = avg; 
    P1.age = age; 
    printf("\n Age is: %d \n", P1.age); 
    printf("Avg is: %lf", P1.avg); 
    printf(" \n Name is: %s \n", P1.letter); 
    return 0; 
} 
+0

請不要在答案中顯示緩衝區溢出代碼。 '%s'需要一個字段寬度,在這種情況下'%9s' - 爲什麼有這樣一個* tiny *緩衝區呢? –

+0

你有沒有跑過這段代碼.. ??它爲me.check解釋工作,如果你想要玩家的商店名稱,那麼你要求字符數組不是單個字符。 – suraj

+0

輸入* christopher-montgomery-joseph *作爲名稱,看看會發生什麼。 'scanf(「%s」,...)'**總是**緩衝區溢出。永遠不要寫這個。 –

0

您正在使用字符數據類型來輸入字符串「char name」,這會導致您導致未定義的行爲。

而不是你聲明一個像這樣的字符數組「char name [10]」,然後讀取名稱。但在分配時必須小心,您不能直接分配您必須使用strcpy這樣。

的strcpy(p1.letter,名稱)(這裏是字母也字符數組)