2015-03-31 93 views
0

我使用開發 - C++代碼::塊 IDE爲C program.I要循環多達10次從user.But我沒有得到正確的output.First我第二次從 得到正確的輸出後,我沒有得到正確的輸出。我沒有在C程序中獲得正確的輸出?


#include<stdio.h> 

main() { 
char g; 
int yos,qual,sal,a = 1; 
printf("\nEnter M for Male and F for Female"); 
printf("\nEnter 0 for Graduate and 1 for Post-Graduate"); 

while(a<=10) { 
    printf("\n\n\nEnter gender, year of service , qualification : "); 
    scanf("%c%d%d",&g,&yos,&qual); 
    if(g=='M' && yos>=10 && qual==1) 
    sal = 15000; 
    else if((g=='M' && yos>=10 && qual==0) || (g=='M' && yos<10 && qual==1)) 
     sal = 10000; 
    else if(g=='M' && yos<10 && qual==0) 
     sal = 7000; 
    else if(g=='F' && yos>=10 && qual==1) 
     sal = 12000; 
    else if(g=='F' && yos>=10 && qual==0) 
     sal = 9000; 
    else if(g=='F' && yos<10 && qual==1) 
     sal = 10000; 
    else if(g=='F' && yos<10 && qual==0) 
     sal = 6000; 
    printf("\nSalary of the employee is : %d",sal); 
     a++; 
    } 

} 

enter image description here

+0

爲什麼你沒有第二次提供服務年限和資質? – Razib 2015-03-31 19:13:09

+1

因爲當他點擊'enter'時,它只是打印出薪水而不是等待更多輸入 – 2015-03-31 19:15:28

+0

檢查'scanf'的返回值。值不會在第二次改變。 – HuStmpHrrr 2015-03-31 19:16:41

回答

2

當您使用

scanf("%c%d%d",&g,&yos,&qual); 

執行該語句的第二次,換行字符讀入g。爲了防止新行和空格被讀入g,使用方法:

scanf(" %c%d%d",&g,&yos,&qual); 
// ^^ Add a space 

就個人而言,我喜歡把空間周圍的其他格式說明過。

scanf(" %c %d %d", &g, &yos, &qual); 
3

兩件事。將space放在%c之前scanf()會佔用它之前的任何空格,並且檢查scanf()返回的正確輸入數量將防止愚蠢的輸出。我用newline分隔符輸入第一組,第二組用space分隔符。

#include <stdio.h> 

int main() 
{ 
    char g; 
    int yos, qual; 

    printf("\nEnter char, int, int: "); 
    if (3 != scanf(" %c%d%d", &g, &yos, &qual)) 
     printf ("Error\n"); 
    else 
     printf("You entered: %c %d %d\n", g, yos, qual); 

    printf("\nEnter char, int, int: "); 
    if (3 != scanf(" %c%d%d", &g, &yos, &qual)) 
     printf ("Error\n"); 
    else 
     printf("You entered: %c %d %d\n", g, yos, qual); 

    return 0; 
} 

程序的輸入/輸出

Enter char, int, int: a 
1 
2 
You entered: a 1 2 

Enter char, int, int: b 6 7 
You entered: b 6 7 
1

的問題是在你的scanf()格式。大多數格式描述符隱含地跳過前導空格,但%c不(因此它可以用於讀取空格)。此外,scanf()只要能夠與格式匹配就可以讀取字符,並且任何不能匹配的字符都會被讀取。考慮這一點,則:

scanf("%c%d%d",&g,&yos,&qual); 

在第一次迭代,它

  1. 讀取 'M' 爲可變g
  2. 第一數目之前跳過空白(換行)
  3. 讀取數字串「10」(最多但不包括換行符),將其轉換爲整數,並將其存儲在yos,
  4. 跳過下一個空白符(換行符)數字
  5. 讀取數字字符串「1」(最多但不包括換行符),將其轉換爲整數,並將其存儲在qual中。

此時,等待輸入的下一個字符是換行符。

在第二次迭代,換行符被掃描到可變g,和scanf()嘗試匹配的整數開始與下一個字符(「M」)。這失敗了,所以scanf()完成,你的程序繼續打印它的輸出。

這是一個有點棘手做交互輸入與scanf(),但你會做一個好一點的有輕微的修改,您的格式:

scanf(" %c%d%d",&g,&yos,&qual); 

此外,您應經常檢查返回值來驗證scanf()已成功匹配所有預期字段(它返回成功匹配的字段數,或者錯誤地輸入EOF,或者如果在任何字段匹配之前達到輸入的結尾)。