2010-08-28 45 views
2

我在使用scanf()將數據存儲到工會時遇到了一個奇怪的問題。使用scanf()進行用戶輸入時出錯

這裏是我的代碼

#include <stdio.h> 

union Student 
{ 
    float score; 
    char grade; 
}; 

int main(void) 
{ 
    union Student jack; 

    printf("Enter student score : "); 
    scanf("%f", &jack.score); 
    printf("Score : %f", jack.score); 

    jack.score=0; 

    printf("Enter student grade : "); 
    scanf("%c", &jack.grade); 
    printf("Grade : %c", jack.grade); 

} 

我得到以下輸出

[email protected]:~/Desktop$ ./union 
Enter student score : 12 
Score : 12.000000Enter student grade : Grade : 

,但如果我我的代碼更改爲:

#include <stdio.h> 

union Student 
{ 
    float score; 
    char grade; 
}; 

int main(void) 
{ 
    union Student jack; 

    printf("Enter student grade : "); 
    scanf("%c", &jack.grade); 
    printf("Grade : %c\n", jack.grade); 

    printf("Enter student score : "); 
    scanf("%f", &jack.score); 
    printf("Score : %f\n", jack.score); 

} 

它給我確切的輸出[正確的輸出]。我知道這不是一個好例子,但有人能解釋我發生了什麼問題嗎?

修改後的代碼:在格式字符串前添加\ n。 [scanf函數( 「\ n%C」,& CH);]

#include <stdio.h> 

    union Student 
    { 
     float score; 
     char grade; 
    }; 

    int main(void) 
    { 
     union Student jack; 

     printf("Enter student score : "); 
     scanf("%f", &jack.score); 
     printf("Score : %f", jack.score); 

     jack.score=0; 

     printf("Enter student grade : "); 
     scanf("\n%c", &jack.grade); 
     printf("Grade : %c", jack.grade); 

    } 
+1

你是什麼意思的確切產出?你能解釋一下嗎? – mhshams 2010-08-28 17:14:50

+0

@mohammad shams確切輸出=正確輸出 – Searock 2010-08-28 17:35:55

+0

我的問題有什麼問題?爲什麼我被拒絕了? – Searock 2010-08-28 17:37:46

回答

2

在第一個例子中,第一個scanf()讀取一個數字,但不包括換行符(假設您不輸入空格和換行符;如果這樣做,它將繼續等待輸入,直到您提供一個數字或一個非數字 - 空白等不計算爲數字或非數字)。然後,帶'%c'格式說明符的第二個scanf()不會跳過空白(與大多數其他格式說明符不同),並讀取換行符(假設您在數字結尾後立即鍵入換行符;如果鍵入了其他內容 - 空格或一封信,也許它會讀取該字符),完全忽略了你在第二行輸入的任何內容。 (實際上,當我運行代碼時,它不會等待我爲第二批輸入輸入任何內容,請嘗試輸入「3.14 + C」或「3.14C」和換行符)。

在第二個示例,第一個scanf()讀取第一個字符。第二個scanf()跳過包括換行符在內的空白區域,直到找到一個數字或某個明確不是數字的字符(如字母)。

這是一個美麗的示範,爲什麼大多數人避免scanf();提供令人滿意的控制是非常困難的。您最好讀線(可能使用fgets();絕對不使用gets()),然後用sscanf()解析它們。這兩個例子你都會得到理智的行爲。

請注意,您的問題與使用union完全無關;你的代碼在工作方式上很好。你的問題都與使用scanf()有關。次要推薦:打印輸出行時 - 除提示外 - 在格式字符串的末尾包含換行符。

+0

感謝您的美麗解釋。非常感謝 : ) – Searock 2010-08-28 18:04:38

2

所不同的是,因爲該串中的\n的。這些可以防止字符串被緩存在輸出緩衝區中,而是立即顯示在屏幕上。

+0

我已經從程序中刪除了/ n,但它仍然給我提供了同樣的錯誤。我請求你複製代碼並嘗試運行它。我對發生了什麼問題毫無頭緒。 – Searock 2010-08-28 17:39:49

1

在第一個示例中,您讀取一個浮點數,然後讀取下一個字符,這將是浮點數後面的換行符(輸入浮點數後按Enter鍵)。

在第二個例子的scanf()格式說明包括換行,所以第一scanf()讀入一個字符接着一個新行和第二scanf()讀取浮子跟着一個新行。

+0

我很抱歉,但我不明白你想說什麼。 – Searock 2010-08-28 17:47:22