Mr_slippe 2021-12-21 17:36 采纳率: 50%
浏览 53
已结题

c语言中,某种情况下,get()函数和scanf()函数连续使用导致scanf()函数跳过。

在用结构体建立一个单链表时分别用gets()函数和scanf()函数为节点中元素赋值,代码如下

struct book
{
    double price;
    char name[30];
    struct book *next;
};

struct book *creatlist(int n)
{
    struct book *pnew, *ptail, *head;
    pnew = (struct book *)malloc(sizeof(struct book));
    gets(pnew->name);
    scanf("%lf", &pnew->price);                      //在实际运行时程序会跳过这条语句
    head = ptail = pnew;                                 //在这里添加断点调试
    for(int i; i < n; i++)
    {
        pnew = (struct book *)malloc(sizeof(struct book));
        gets(pnew->name);
        scanf("%lf",&pnew->price);
        ptail->next = pnew;
        ptail = pnew;
        ptail->next = NULL;
    }
    return head;
}
.......

img

img

可以看到在输入字符串后没有输入数据而程序直接跳过了scanf()语句。

但是在一般的情况下,不涉及单链表,这两个函数连用就没有影响,如下

img

img

让人迷惑额

  • 写回答

2条回答 默认 最新

  • 关注

    因为前面 scanf("%lf", &pnew->price);用户输入了数据和换行符‘\n’,在读取了数据之后,输入缓存里就残留了一个‘\n’。
    下次再使用gets(pnew->name); 会读取输入缓存里上次残留的‘\n’,而不是读取新输入的字符。这样就造成了严重的错误。

    可以在用 读取字符前用 setbuf(stdin, NULL); 清除输入缓存。

        setbuf(stdin, NULL);
        gets(pnew->name);
    
       
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月29日
  • 已采纳回答 12月21日
  • 创建了问题 12月21日

悬赏问题

  • ¥15 前端echarts坐标轴问题
  • ¥15 CMFCPropertyPage
  • ¥15 ad5933的I2C
  • ¥15 请问RTX4060的笔记本电脑可以训练yolov5模型吗?
  • ¥15 数学建模求思路及代码
  • ¥50 silvaco GaN HEMT有栅极场板的击穿电压仿真问题
  • ¥15 谁会P4语言啊,我想请教一下
  • ¥15 这个怎么改成直流激励源给加热电阻提供5a电流呀
  • ¥50 求解vmware的网络模式问题 别拿AI回答
  • ¥24 EFS加密后,在同一台电脑解密出错,证书界面找不到对应指纹的证书,未备份证书,求在原电脑解密的方法,可行即采纳