void fill_boxes(box *boxes, int length)
{
char *n;
for (int i = 0; i < length; i++) {
printf("Enter box %d id: ", i+1);
//scanf("%d",&boxes[i].id);
fgets(n,25,stdin);
boxes[i].id = strtol(n,NULL,10);
printf("Enter box %d name: ", i+1);
//scanf(" %49[^\n]",boxes[i].name);
fgets(boxes[i].name,50,stdin);
}
}
我尝试用这个方法来代替scanf,它看起来像python中的input()函数,它把输入作为一个字符串,然后你把它转换成你想要的任何类型,这就是我用fgets()和strtol()所做的,我想问的是,这是否是scanf的一个很好的替代方案,或者有更好的解决方案可用?
1条答案
按热度按时间v8wbuo2f1#
fgets()
在传递有效参数时是良好的。fgets(n,25,stdin)
在此代码中是错误的,因为指针n
的值不确定。char *n;
,而是使用char buffer[100];
这样的示例大小的数组。我建议使用预期最大大小的2倍。sizeof
确定数组大小,而不是幻数。fgets()
返回值。fgets()
和scanf()
,我建议只在理解scanf()
为什么有问题之前使用fgets()
。其他代码问题:
"123 zxfc\n"
对应boxes[i].id
)会发生什么情况?fgets(boxes[i].name,50,stdin);
是一个问题,因为boxes[i].name
中很少需要尾随的'\n'
。在读取后将'\n'
归零,限制减少1,这是可以存储在boxes[i].name
中的限制。