[PIC/AVR MCU] gets与scanf连着使用的注意事项你知道吗?

事情是这样的,蘑菇群有个朋友听说我懂技术,加了我好友,两个月后的今天终于麻烦到我了。他写了一个C语言的大学课程设计,其中想使用gets()读取一个字符串到一个数组,结果,总是不读,跳过了这条语句,他不知道怎么回事就找到我来问了。程序 如下问题在第81行的gets(beizhu);
 

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#define MAX 1000

struct date{//日期

        int Year;

        int Month;

        int Day;

};

struct xinxi{//设计信息结构体

    int Szqk;//收入、支出情况

        double Jine;//金额

        int Yongtu; //用途

        struct date Time;//日期

        char Beizhu[100];//备注

};

struct shuzu{

        struct xinxi tiao[MAX];//信息条

        int size;//当前记录个数

};

void caidan()

{   

        system("cls");

        printf("-------------------财务管理系统-------------------\n");

        printf("                       收入                       \n");

        printf("                    1.添加收入                    \n");

        printf("                    2.查询收入                    \n");

        printf("                    3.删除收入                    \n");

        printf("                    4.修改收入                    \n");

        printf("--------------------------------------------------\n");

        printf("                       支出                       \n");

        printf("                    5.添加支出                    \n");

        printf("                    6.查询支出                    \n");

        printf("                    7.删除支出                    \n");

        printf("                    8.修改支出                    \n");

        printf("--------------------------------------------------\n");

        printf("                     文件操作                     \n");

        printf("                    9.导出                        \n");

        printf("                    0.退出系统                    \n");

        printf("--------------------------------------------------\n");

}

void add(int n,struct shuzu * a){//添加

        int f=1;

        system("cls");//清空页面

        if(a->size==MAX){

                printf("记录条已经满啦!可以删除一些喔!\n");//记录条上限

        }else{

                while(f){

                        printf("开始添加信息条吧!\n");//输入信息

                        a->tiao[a->size].Szqk=n;

                        printf("请输入金额\n");

                        double jine;//添加金额

                        scanf("%lf",&jine);

                        a->tiao[a->size].Jine=jine;

                        printf("请选择用途:\n");

                        printf("1.服饰\n");

                        printf("2.餐饮\n");

                        printf("3.出行\n");

                        printf("4.娱乐\n");

                        printf("5.其他\n");

                        int yongtu;//添加用途

                        scanf("%d",&yongtu);

                        a->tiao[a->size].Yongtu=yongtu;

                        int year,month,day;//输入日期

                        printf("请输入年份:\n");

                        scanf("%d",&year);

                        printf("请输入月份:\n");

                        scanf("%d",&month);

                        printf("请输入日子:\n");

                        scanf("%d",&day);

                        a->tiao[a->size].Time.Year=year;//给数组传递日期

                        a->tiao[a->size].Time.Month=month;

                        a->tiao[a->size].Time.Day=day;

                        char beizhu[100];

                        printf("请输入备注(无备注可直接按回车):\n");//输入备注

                        gets(beizhu);

                        for(int i=0;i<strlen(beizhu);i++){

                                a->tiao[a->size].Beizhu[i]=beizhu[i];

                        }

                        system("cls");//清空数据,告诉用户信息条添加成功。

                        printf("1     ");

                        if(n==1) printf("收入      ");

                        else printf("支出      ");

                        printf("%.1f        ",jine);

                        switch(yongtu){

                                case 1:

                                        printf("服饰      ");

                                        break;

                                case 2:

                                        printf("餐饮      ");

                                        break;

                                case 3:

                                        printf("出行      ");

                                        break;

                                case 4:

                                        printf("娱乐      ");

                                        break;

                                case 5:

                                        printf("其他      ");

                                        break;

                        }

                        printf("%d/%d/%d     ",year,month,day);

                        puts(beizhu);

                        printf("\n添加成功!\n");

                        printf("是否需要继续添加信息条(1.  0.否):");

                        scanf("%d",&f);

                }

               

        }

}

int main(){

        struct shuzu a;//创建数组

        a.size=0;

        int xz=0;//用户输入选择内容

        while(1){

                caidan();

                scanf("%d",&xz);

                switch(xz){

                        case 1://添加收入信息

                                a.size++;

                                add(xz,&a); //地址传递

                                break;

                        case 2://查询收入信息

                                break;

                        case 3://删除收入信息

                                break;

                        case 4://修改收入信息

                                break;

                        case 5://添加支出信息

                                break;

                        case 6://查询支出信息

                                break;

                        case 7://删除支出信息

                                break;

                        case 8://修改支出信息

                                break;

                        case 9://打印信息

                                break;

                        case 0://退出系统

                                printf("期待下次见面\n");

                                system("pause");

                                return 0;

                                break;

                }

        }

       

        return 0;

}



这是执行的结果,没看到让输入备注信息就到这一步了。
发给我后,我对前后代码进行阅读,发现前面使用的都是scanf进行数据的读取,而这里他突然使用了gets。
根据我的了解,问题就出在这里了。
scanf为格式化输入语句,所谓的格式化,就是严格的按照格式化关键字从数据流读取需要的数据,不需要的多余的控制符,不会去从数据流中取出的。

   scanf("%d",&day);

                        a->tiao[a->size].Time.Year=year;//给数组传递日期

                        a->tiao[a->size].Time.Month=month;

                        a->tiao[a->size].Time.Day=day;

                        char beizhu[100];

                        printf("请输入备注(无备注可直接按回车):\n");//输入备注

                        gets(beizhu);

注意这一段,前面是个scanf,读取一个整数。那么后面你输入完了数字会干什么呢?会按下回车,这个回车就继续停留在了数据输入流中。
而gets有个特点,就是以读到回车或换行作为结束标志,并丢弃这个回车或换行符。
所以问题出在这里,gets遇到了前面你输入的那个回车,认为结束了,就跳过了。
所以这里就是想法处理掉前面的回车,这里可以用getchar()接管之前的那个回车符号,并什么都不做,以丢弃。

   scanf("%d",&day);

                        a->tiao[a->size].Time.Year=year;//给数组传递日期

                        a->tiao[a->size].Time.Month=month;

                        a->tiao[a->size].Time.Day=day;

                        char beizhu[100];

                        printf("请输入备注(无备注可直接按回车):\n");//输入备注

                        getchar();

                        gets(beizhu);

所以我们可以在gets()与scanf之间添加一个getchar()解决这个问题。增加了这一句后,程序运行达到了想要的结果了。

---------------------
作者:gaoyang9992006
链接:https://bbs.21ic.com/icview-3231944-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值