Arbitrary007 2021-02-13 12:17 采纳率: 66.7%
浏览 131
已采纳

请问一下getchar和scanf连用这个地方的相关问题

编译器:vc++6.0

问题:请问这里getchar和scanf颠倒,为什么出现了以下不一样的结果?

我的代码1:

  1. #include<stdio.h>
  2.  
  3. typedef struct student_score
  4. {
  5.     int number;
  6.     int score[5];
  7.     int average;
  8. }data;
  9. void average_subject(data **p)
  10. {
  11.    int i,sum=0;
  12.    for(i=0;i<5;i++)
  13.    {
  14.        sum=0;
  15.        for(int j=0;j<10;j++)
  16.        {
  17.            sum+=(*(p+j))->score[i];
  18.        }
  19.        printf("the %dth subject's average score is:%d\n",i+1,sum/10);
  20.       
  21.    }
  22.    printf("\n");
  23. }
  24. void failed(data **p)
  25. {
  26.     puts("\nthe fail mark:socre<80");
  27.     int i,sum=0;
  28.     int k=0;
  29.     int flag=0;
  30.     data student1[10];
  31.     for(i=0;i<10;i++)
  32.     {
  33.         sum=0;
  34.         for(int j=0;j<5;j++)
  35.             sum+=(*(p+i))->score[j];
  36.         if(sum/5<80)
  37.         {
  38.             student1[k].average=sum/5;
  39.             student1[k++].number=(*(p+i))->number;
  40.             flag=1;
  41.         }
  42.         else 
  43.             continue;
  44.     }
  45.     if(!flag)
  46.     {
  47.         printf("there're no falied student\n");
  48.     }
  49.     else if(flag)
  50.     {
  51.     int temp=0;
  52.     for(i=0;i<k-1;i++)
  53.         for(int j=i+1;j<k;j++)
  54.         {
  55.             if(student1[i].average>student1[j].average)
  56.             {
  57.                 temp=student1[i].average;
  58.                 student1[i].average=student1[j].average;
  59.                 student1[j].average=temp;
  60.             }
  61.         }
  62.         printf("the list of faild students:\n");
  63.         for(i=0;i<k;i++)
  64.         {
  65.             printf("the number is:%d,average score is:%d\n",student1[i].number,student1[i].average);
  66.         }
  67.     }
  68.         printf("\n");
  69.     
  70. }
  71. void average_individual(data **p)
  72. {
  73.     int i,sum=0;
  74.     for(i=0;i<10;i++)
  75.     {
  76.         sum=0;
  77.         for(int j=0;j<5;j++)
  78.             sum+=(*(p+i))->score[j];
  79.         printf("the %dth student's average score is%d\n",(*(p+i))->number,sum/5);
  80.     }
  81.     printf("\n");
  82. }
  83. void total(void (*pfun)(data**),data **p1)
  84. {
  85.     pfun(p1);
  86. }
  87. void main()
  88. {
  89.     char ch;
  90.     data student[10];
  91.     data *pdata[10];
  92.     puts("please input the data of thrity students:");
  93.     for(int i=0;i<10;i++)
  94.     {
  95.         student[i].number=i+1;
  96.         printf("the %dth student scores:",i+1);
  97.         for(int j=0;j<5;j++)
  98.         {
  99.             scanf("%d",&student[i].score[j]);
  100.         }
  101.         pdata[i]=&student[i];
  102.     }
  103.     
  104.     void (*ptotal)(void(*)(data**),data**)=total;
  105.     do
  106.     {
  107.         printf("\n");
  108.         printf("the average of student's subjects-----1\n");
  109.         printf("the failed student number and socre---2\n");
  110.         printf("the average of individuals------------3\n");
  111.         printf("if you want break please input--------0\n");
  112.         printf("please make a option:");
  113.         scanf("%c",&ch);
  114.         getchar();
  115.         
  116.         switch(ch)
  117.         {
  118.         case '1':ptotal(average_subject,pdata);break;
  119.         case '2':ptotal(failed,pdata);break;
  120.         case '3':ptotal(average_individual,pdata);break;
  121.         case '0':break;
  122.         }
  123.     }while(ch!='0');
  124.  
  125. }

 代码1的运行结果:

出现一直重复的情况

 

我的代码2:

#include<stdio.h>


typedef struct student_score
{
    int number;
    int score[5];
    int average;
}data;

void average_subject(data **p)
{
   int i,sum=0;
   for(i=0;i<5;i++)
   {
       sum=0;
       for(int j=0;j<10;j++)
       {
           sum+=(*(p+j))->score[i];
       }
       printf("the %dth subject's average score is:%d\n",i+1,sum/10);
      
   }
   printf("\n");
}

void failed(data **p)
{
    puts("\nthe fail mark:socre<80");
    int i,sum=0;
    int k=0;
    int flag=0;
    data student1[10];
    for(i=0;i<10;i++)
    {
        sum=0;
        for(int j=0;j<5;j++)
            sum+=(*(p+i))->score[j];
        if(sum/5<80)
        {
            student1[k].average=sum/5;
            student1[k++].number=(*(p+i))->number;
            flag=1;
        }
        else 
            continue;
    }
    if(!flag)
    {
        printf("there're no falied student\n");
    }

    else if(flag)
    {
    int temp=0;
    for(i=0;i<k-1;i++)
        for(int j=i+1;j<k;j++)
        {
            if(student1[i].average>student1[j].average)
            {
                temp=student1[i].average;
                student1[i].average=student1[j].average;
                student1[j].average=temp;
            }

        }
        printf("the list of faild students:\n");
        for(i=0;i<k;i++)
        {
            printf("the number is:%d,average score is:%d\n",student1[i].number,student1[i].average);
        }
    }

        printf("\n");

    

}

void average_individual(data **p)
{
    int i,sum=0;
    for(i=0;i<10;i++)
    {
        sum=0;
        for(int j=0;j<5;j++)
            sum+=(*(p+i))->score[j];
        printf("the %dth student's average score is%d\n",(*(p+i))->number,sum/5);
    }

    printf("\n");

}

void total(void (*pfun)(data**),data **p1)
{
    pfun(p1);
}

void main()
{
    char ch;
    data student[10];
    data *pdata[10];
    puts("please input the data of thrity students:");
    for(int i=0;i<10;i++)
    {
        student[i].number=i+1;
        printf("the %dth student scores:",i+1);
        for(int j=0;j<5;j++)
        {
            scanf("%d",&student[i].score[j]);
        }
        pdata[i]=&student[i];
    }
    
    void (*ptotal)(void(*)(data**),data**)=total;
    do
    {
        printf("\n");
        printf("the average of student's subjects-----1\n");
        printf("the failed student number and socre---2\n");
        printf("the average of individuals------------3\n");
        printf("if you want break please input--------0\n");
        printf("please make a option:");
        getchar();
        scanf("%c",&ch);
            
        switch(ch)
        {
        case '1':ptotal(average_subject,pdata);break;
        case '2':ptotal(failed,pdata);break;
        case '3':ptotal(average_individual,pdata);break;
        case '0':break;
        }

    }while(ch!='0');


}

 

运行结果:

程序正常进行。

 

请问我这两个地方颠倒为什么会出现这样的差别?代码1中我将getchar放在scanf后面,在输入队列中难道不是字符赋给了ch,按键盘回车刚好被getchar吸收了吗,而代码2中颠倒过来却是正确的,希望大神能解答一下其中的原理,谢谢~~

  • 写回答

1条回答 默认 最新

  • ProfSnail 2021-02-13 12:31
    关注

    兄弟,不用出示样例了。我看明白了。

    你这个代码里面是先输入50个数字,然后统一按一下回车键,接下来再逐个判断每次的读入标记'1','2','3','0'。

    问题就处在输入完50个数字之后按下的这个回车键上了,由于此前一直使用的是scanf("%d", &student[i].score[j]);,读取%d一个整数的时候,会自动过滤掉行尾的换行键,但是在这之后,你读取的是字符模式,所以此前的9个回车键不用处理,最后第十个回车键需要进行单独处理。

    第一份代码里面,第一次scanf("%c", &ch);,ch里面的内容是50个数字(也就是第十行)之后的回车键。

    所以第二份代码吸收掉这个回车键之后,代码就正确了。

     

    或者改成以下代码,专门添加一行以吸收getchar()就可以了。

    int main()
    {
        char ch;
        data student[10];
        data* pdata[10];
        puts("please input the data of thrity students:");
        for (int i = 0; i < 10; i++)
        {
            student[i].number = i + 1;
            printf("the %dth student scores:", i + 1);
            for (int j = 0; j < 5; j++)
            {
                scanf("%d", &student[i].score[j]);
            }
            pdata[i] = &student[i];
        }
        getchar();//吸收掉50个样例之后按下的那个回车键。
    
        void (*ptotal)(void(*)(data**), data**) = total;
        do
        {
            printf("\n");
            printf("the average of student's subjects-----1\n");
            printf("the failed student number and socre---2\n");
            printf("the average of individuals------------3\n");
            printf("if you want break please input--------0\n");
            printf("please make a option:");
            scanf("%c", &ch);
            getchar();
    
            switch (ch)
            {
            case '1':ptotal(average_subject, pdata); break;
            case '2':ptotal(failed, pdata); break;
            case '3':ptotal(average_individual, pdata); break;
            case '0':break;
            }
    
        } while (ch != '0');
    
    
    }

    如果还有不理解的地方可以留言讨论,希望能够帮到兄弟,望采纳! 

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥35 平滑拟合曲线该如何生成
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站