fgets阻塞 stdin 退出_来自stdin问题的fgets[c]

我试过你的代码,但无法重现问题。以下代码的工作方式正是您所期望的,它会提示您输入名称,等待您键入名称,然后提示您输入地址,等等。

我想知道你是否不需要在提示输入更多信息之前阅读stdin并清空它?

typedef struct {

char* name;

char* address;

}employeeRecord;

int readrecord(employeeRecord &record)

{

char name[50];

char address[100];

printf("\nenter the name:");

fgets(name, sizeof(name), stdin);

record.nameLength = strlen(name) + 1;

record.name = malloc(sizeof(char)*record.nameLength);

strcpy(record.name,name);

printf("\nenter the address:");

fgets(address, sizeof(address), stdin);

...

}

顺便说一句,您想在strlen(name)中加1,而不是减去1。或者,如果希望名称存储在记录中而不带终止空值,则需要使用memcpy将字符串复制到记录中,而不是strcpy。

编辑:

我从你的评论中看到

scanf

要读取选择值,这将在输入缓冲区中留下一个,然后由第一个

fgets

打电话。相反,您应该使用fgets读取选择行,然后使用sscanf解析输入中的值。这样地

int choice;

char temp[50];

fgets(temp, sizeof(temp), stdin);

sscanf(temp, "%d", &choice);

这应该会使冲洗stdin的整个问题变得毫无意义。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值