对于作业,我必须按如下方式声明结构:
struct Food
{
char *name;
int weight, calories;
} lunch[5] = {
{
"apple", 4, 100
},
{
"salad", 2, 80
}
};
在我的主要内容中,我试图让用户输入其余的输入来填充结构以将其打印出来。我想我会尝试使用malloc。我会做这样的事吗?
int main(void)
{
char *str1;
printf("Please enter a food, weight, and calories of the food: ");
scanf("%s", (char *)malloc(str1));
return(EXIT_SUCCESS);
}
答案 0 :(得分:2)
嗯......不太好。
您只需将malloc()
的结果传递给scanf()
,并且该函数不会返回它,您将丢失指针。这通常是个坏主意。另外,investigate什么参数malloc()
期望,你做得不对。
首先考虑分配内存,使用指针变量来存储它,然后将该指针的值传递给scanf()
。提示:你的数组中已经有了指针变量。
另外,you shouldn't cast C中malloc()
的返回值和return
不是函数,因此它的值不应该有括号。
答案 1 :(得分:1)
您应该为Food
的新实例分配空间,然后为name
分配空间。如果所有分配都成功,那么您可以开始向用户询问数据。
答案 2 :(得分:0)
您应该查看您的课程资料,阅读阅读清单上的书籍,或者询问您的讲师。
如果你必须在网上进行自己的研究,你或许应该尝试理解this example和谷歌类似的方法。
通常,您不应使用scanf来解析用户输入。使用getline来检索一行用户输入,然后使用strdup和atoi这样的实用程序来提取你的值,每行一个而不是在同一行上,并检查错误值等等,这样更加直接和健壮。
答案 3 :(得分:0)
以下是我将如何解决这个问题的一个小例子。 Unfortunatley我无法测试代码,我现在正在学习C语言,但也许这会给你一些想法。这只会在午餐时初始化实例[2]。所以你应该添加某种循环来填充其他实例。
int main(void)
{
lunch[2].name = (char*) malloc(/*The size of the string you want for the
name of your food. Every character has
the size of one byte (+'\0' at the end)*/)
printf("Please enter a name for your food: ");
scanf("%s", lunch[2].name);
printf("Please enter the weight of your food: ");
scanf("%d", &lunch[2].weight;
printf("Please enter calories of your food: ");
scanf("%d", &lunch[2].calories);
return EXIT_SUCCESS;
}
答案 4 :(得分:0)
getline,strtok,strdup,atoi
剩下的就是练习:-)