user-0 提问:  大家帮我看看为什么我这个程序“try again？Y or N”会出现2次？我用的ipad编译器

回复:
user: user-0
content: 引用 2 楼 forever74 的回复:你的getchar第一次抓到的是之前留在缓冲区里的换行符，所以循环空转了一次。  另外，不要把getchar 和scanf混淆，它一般不会返回1的。 有道理，说的很对！，谢谢，不过前面已经给了我正确答案了

user: user-0
content: 引用 1 楼 user-2 的回复:楼主的逻辑设计太繁琐了，可以考虑简化下。程序修改如下，供参考：#include <stdio.h> #define STEP1 17850 #define STEP2 23900 #define STEP3 29750 #define STEP4 14875  int main(int argc, char* argv[]) {     float salary;     float tax;       int kind;       int step;      char ch;       int break1;     while(1)          {            printf("Please sected your kind:1，单身；2，户主；3，已婚，共有；4已婚，离异\n");            if(scanf("%d",&kind)!=1)              {                printf("Please enter a correct number!\n");                continue;              }         //};  这里多了‘；’号            if(kind>=5)              {                printf("Please enter a correct number(1-4):\n");                continue;              }            if(kind<0)  break;            else              {                switch(kind)                  {                    case(1):step=STEP1;break;                    case(2):step=STEP2;break;                    case(3):step=STEP3;break;                    case(4):step=STEP4;break;                  }                while(1)                  {                    printf("Please enter your salarys in this year:\n");                    if(scanf("%f",&salary)!=1)  continue;                    else if(salary<=0) tax=0;                         else if(salary<step) tax=salary*0.15;                              else                                 tax=step*0.15+(salary-step)*0.28;                    break;                  }                printf("you tax is $%.2f.\n",tax);              }            while(1)             {               printf("try again ?Y or N\n");               getchar();  //吃掉缓冲区多余字符               ch=getchar();               //if((ch=getchar())==1&&ch!='Y'&&ch!='y'&&ch!='N'&&ch!='n')continue;               if(ch=='Y'||ch=='y')                 {                   break1=1; break;                 }               else if(ch=='N'||ch=='n')                 {                   break1=0; break;                   }             }            if(!break1) break;          }     printf("Done!\n");      return 0; } 太赞了，完全正确，谢谢！

user: user-1
content: 你的getchar第一次抓到的是之前留在缓冲区里的换行符，所以循环空转了一次。  另外，不要把getchar 和scanf混淆，它一般不会返回1的。

user: user-2
content: 楼主的逻辑设计太繁琐了，可以考虑简化下。程序修改如下，供参考：#include <stdio.h> #define STEP1 17850 #define STEP2 23900 #define STEP3 29750 #define STEP4 14875  int main(int argc, char* argv[]) {     float salary;     float tax;       int kind;       int step;      char ch;       int break1;     while(1)          {            printf("Please sected your kind:1，单身；2，户主；3，已婚，共有；4已婚，离异\n");            if(scanf("%d",&kind)!=1)              {                printf("Please enter a correct number!\n");                continue;              }         //};  这里多了‘；’号            if(kind>=5)              {                printf("Please enter a correct number(1-4):\n");                continue;              }            if(kind<0)  break;            else              {                switch(kind)                  {                    case(1):step=STEP1;break;                    case(2):step=STEP2;break;                    case(3):step=STEP3;break;                    case(4):step=STEP4;break;                  }                while(1)                  {                    printf("Please enter your salarys in this year:\n");                    if(scanf("%f",&salary)!=1)  continue;                    else if(salary<=0) tax=0;                         else if(salary<step) tax=salary*0.15;                              else                                 tax=step*0.15+(salary-step)*0.28;                    break;                  }                printf("you tax is $%.2f.\n",tax);              }            while(1)             {               printf("try again ?Y or N\n");               getchar();  //吃掉缓冲区多余字符               ch=getchar();               //if((ch=getchar())==1&&ch!='Y'&&ch!='y'&&ch!='N'&&ch!='n')continue;               if(ch=='Y'||ch=='y')                 {                   break1=1; break;                 }               else if(ch=='N'||ch=='n')                 {                   break1=0; break;                   }             }            if(!break1) break;          }     printf("Done!\n");      return 0; }