在C中使用malloc作为char输入

时间:2009-11-10 07:43:34

标签: c malloc

对于作业,我必须按如下方式声明结构:

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);
}

5 个答案:

答案 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

剩下的就是练习:-)