используя malloc для ввода символов в C - PullRequest
0 голосов
/ 10 ноября 2009

Для назначения я должен объявить структуру следующим образом:

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 ]

2 голосов
/ 10 ноября 2009

Ну ... Не совсем.

Вы просто передаете результат malloc() в scanf(), и эта функция не возвращает его, вы теряете указатель. Это вообще плохая идея. Кроме того, исследуйте какой аргумент malloc() ожидает, вы делаете это неправильно.

Попробуйте сначала выделить память, используя переменную-указатель для ее хранения, а затем передать значение этого указателя в scanf(). Подсказка: у вас уже есть переменная-указатель в вашем массиве.

Кроме того, вы не должны приводить возвращаемое значение malloc() в C, а return не является функцией, поэтому у него не должно быть скобок вокруг его значения.

1 голос
/ 10 ноября 2009

Вы должны скорее выделить место для нового экземпляра Food, а затем выделить место для name. Если все распределения выполнены успешно, вы можете начать запрашивать данные у пользователя.

0 голосов
/ 11 ноября 2009

getline, strtok, strdup, atoi

остальное оставлено в качестве упражнения :-)

0 голосов
/ 10 ноября 2009

Вот небольшой пример того, как я бы поступил по этому поводу. К сожалению, я не могу проверить код и сейчас изучаю 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;
}
0 голосов
/ 10 ноября 2009

Вам следует посмотреть материалы своего курса, прочитать книги в списке чтения или спросить своего лектора.

Если вам необходимо провести собственное исследование в Интернете, вам, возможно, следует попытаться понять этот пример и поискать похожие инструкции в Google.

Как правило, вы не должны использовать scanf для анализа ввода пользователя. Гораздо проще и надежнее использовать getline для извлечения строки пользовательского ввода, а затем утилиты, такие как strdup и atoi, для извлечения ваших значений, по одному на строку, а не на одной строке, и проверки на наличие ошибок и тому подобное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...