将参数struct传递给C中的函数

时间:2017-12-15 14:21:14

标签: c function struct parameter-passing

我是系统分析师&开发人员学生,我正在尝试编写代码但是我被卡住了,结构和函数很容易理解,但是同时使用它们......是一个废话......

我做错了什么?

#include<stdio.h>
#include<stdlib.h>
#include<locale.h>

typedef struct mercearia
{
    char mercadoria[20];
    int quantidade;
    int valor;

} mercearia;

void EstruturaCadastro(struct mercearia *m)
{
    int i;

    for(i = 0; i < 5; i++)
    {
        printf("\n");

        setbuf(NULL, stdin);
        printf("Insira nome do produto a cadastrar: ");
        scanf("%s", &(*m)[i].mercadoria);

        setbuf(NULL, stdin);
        printf("Insira a quantidade do produto: ");
        scanf("%i", &(*m)[i].quantidade);

        setbuf(NULL, stdin);
        printf("Insira o valor do produto: R$ ");
        scanf("%i", &(*m)[i].valor);
    }
}
    int main(void)
    {
        setlocale(LC_ALL, "");
        struct mercearia m[5];
        EstruturaCadastro(&m);
    }

它给了我巨大的错误列表。然后我写了相同的代码,但没有创建结构数组,代码完美。我错过了一些东西。

#include<stdio.h>
#include<stdlib.h>
#include<locale.h>

typedef struct mercearia
{
    char mercadoria[20];
    int quantidade;
    int valor;

} mercearia;


void EstruturaCadastro(struct mercearia *x)
{
    printf("\n");

    printf("Insira nome do produto: ");
    scanf("%s", &(*x).mercadoria);setbuf(NULL, stdin);

    printf("Insira a quantidade do produto: ");
    scanf("%i", &(*x).quantidade);setbuf(NULL, stdin);

    printf("Insira o valor do produto: R$ ");
    scanf("%i", &(*x).valor);setbuf(NULL, stdin);
}

    int main(void)
    {
        setlocale(LC_ALL, "");
        struct mercearia produto;

        EstruturaCadastro(&produto);
    }

2 个答案:

答案 0 :(得分:1)

在尝试第一个(更难)

之前,您需要了解第二个例子(简单)
void EstruturaCadastro(struct mercearia *x)
{
    printf("\n");

    printf("Insira nome do produto: ");
    scanf("%s", x->mercadoria);

    printf("Insira a quantidade do produto: ");
    scanf("%i", &x->quantidade);

    printf("Insira o valor do produto: R$ ");
    scanf("%i", &x->valor);
}

无需setbuf()调用,按键时刷新标准符

完成此操作后,您可以在第一个示例中更改为m[i]->mercadoria等。

答案 1 :(得分:0)

您的原始功能有各种各样的错误。你向它传递了一个指向struct mercearia的指针,这对于传入你的数组来说很好。在函数内部,您可以像对待数组一样处理m,因此例如m[0].valor是您访问第一个元素的valor值的方式。

这意味着您对scanf的各种来电变为

    scanf("%s", m[i].mercadoria);
    scanf("%i", &m[i].quantidade);
    scanf("%i", &m[i].valor);

注意,对于不同于其他数据类型的字符串读取,您不需要将指针传递给字符串,因此您不需要前面的&