【问题标题】:using malloc for char inputs in C在 C 中使用 malloc 进行字符输入
【发布时间】:2009-11-10 07:43:34
【问题描述】:

对于赋值,我必须声明一个结构如下:

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

【问题讨论】:

    标签: c malloc


    【解决方案1】:

    嗯……不完全是。

    您只需将malloc() 的结果传递给scanf(),该函数不会返回它,您会丢失指针。这通常是一个坏主意。另外,investigatemalloc() 期望的参数是什么,你做得不对。

    考虑首先分配内存,使用指针变量来存储它,然后将该指针的值传递给scanf()。提示:你的数组中已经有了指针变量。

    另外,you shouldn't cast 是 C 语言中malloc() 的返回值,而return 不是函数,因此它的值不应有括号。

    【讨论】:

    • 那么更像这样的东西?字符 *str1; if ((str1 = (char *)malloc(sizeof(char))) = NULL) { printf("错误分配字符串 1"); } printf("请输入食物的食物、重量、卡路里:"); scanf("%s", str1);
    • @Jonathan:这要好得多,是的。但是放弃返回值的强制转换,并考虑需要分配多少内存。 sizeof (char) 作为数字的值是多少?这么多字节够吗?在你展示的定义中,你不是已经有了一个要使用的指针吗?
    • 内存部分让我很困惑。 malloc 没有分配适当的内存量吗?我认为 char 的大小是由至少 8 位的最小值定义的?还是 1 个字节?
    • char *str1 = malloc(sizeof(char *)); printf("请输入食物的食物、重量、卡路里:"); scanf("%s", str1);
    • @Jonathan:是的,sizeof(char) 是 1 个字节。一个字符串由许多字符组成,您只为 1 分配空间。事实上,即使是一个字符的字符串也需要 2 个字节(1 个用于实际字符,1 个用于终止 '\0' 字符)。
    【解决方案2】:

    您应该为Food 的新实例分配空间,然后为name 分配空间。如果所有分配都成功,那么您可以开始向用户询问数据。

    【讨论】:

    • 据我了解,他拥有的是一个Food数组,有5个项目的空间,但最初只包含2个项目。但我可能弄错了。
    • 我现在正在学习 C,所以我在这里不太确定,但我认为他有 stuct "Food",它在数组 "lunch" 中存在五次。午餐的前两个 Food 实例已初始化,他想填满剩下的三个。
    【解决方案3】:

    你应该看看你的课程材料,阅读阅读清单上的书籍,或者询问你的讲师。

    如果您必须自己进行在线研究,您或许应该尝试了解 this example 和 google 以获取类似的操作方法。

    一般来说,您不应该使用 scanf 来解析用户输入。使用 getline 检索一行用户输入,然后使用诸如 strdup 和 atoi 之类的实用程序来提取您的值,每行一个而不是在同一行上,并检查错误值等,它更加直接和强大。

    【讨论】:

      【解决方案4】:

      这是一个小例子,说明我将如何解决这个问题。不幸的是,我无法测试代码,目前我正在自己学习 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;
      }
      

      【讨论】:

        【解决方案5】:

        getline、strtok、strdup、atoi

        剩下的留作练习:-)

        【讨论】:

          猜你喜欢
          • 2012-11-11
          • 2020-04-30
          • 1970-01-01
          • 2016-11-16
          • 1970-01-01
          • 2015-08-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多