使用用户输入填充结构并通过指针访问

时间:2014-06-16 18:25:25

标签: c formatting

我正在尝试创建一个由用户填充并通过指针访问的结构。

现在看来我没有得到编译器错误,但它不会正确输入,我需要输入第二个变量两次,输出是垃圾。

我试图在转移到链接列表之前获取指针和结构,任何帮助都将不胜感激。

//struct date

struct data {    
    int dia;
    int mes;
    int ano;
};

//struct client

struct cliente {        
    char nome[15];
    int num_conta;
    float saldo;
    struct data dia_d_mes;          
};


// function that returns pointer to struct populated by user

struct cliente *input_cliente()
{    
    struct cliente *tipo_cliente, n;        
    SYSTEMTIME st;
    GetSystemTime (&st);

    tipo_cliente = &n;

    printf ("Nome cliente:");   
    gets (tipo_cliente->nome);
    //fflush (stdin);

    printf ("Numero da conta:");
    scanf ("%d ", &tipo_cliente->num_conta);

    printf ("Saldo da conta:");
    scanf ("%f ", &tipo_cliente->saldo);

    tipo_cliente->dia_d_mes.dia = st.wDay;
    tipo_cliente->dia_d_mes.mes = st.wMonth;
    tipo_cliente->dia_d_mes.ano = st.wYear;

    return tipo_cliente;            // return pointer    
}

//print client

void print_cliente(struct cliente *tipo_cliente)
{    
    printf  ("%s", tipo_cliente->nome);
    printf  ("\t%d", tipo_cliente ->num_conta);
    printf  ("\t%.2f", tipo_cliente ->saldo);
    printf  ("\t%d/%d/%d\n", tipo_cliente->dia_d_mes.dia, tipo_cliente->dia_d_mes.mes, tipo_cliente->dia_d_mes.ano);    
}


int main()
{    
    struct cliente *novo;       //declare a new struct pointer
    system ("color 17");
    system ("mode 70,10");

    novo = input_cliente();     //create new client

    system ("cls");

    printf ("Nome \t #conta \t Saldo \tData\n");
    printf ("============================================\n");

    print_cliente (novo);       //print new client    
}

我一直在玩代码并将指针更改为正常结构输入,但仍然存在一个常量问题 当第二个printf被显示并输入int时,它不会移动到下一个printf,光标移动到命令提示符中的新行。任何想法都会被贬低,我用指针尝试了不同的东西,但没有,但我的想法已经用完了。

//返回指向用户填充的struct的指针的函数

struct cliente input_cliente() {     struct cliente tipo_cliente; //初始化struct     SYSTEMTIME st;     GetSystemTime(& st);

printf ("Nome cliente:");
gets (tipo_cliente.nome);                //accepts this value

printf ("Numero da conta:");
scanf ("%d ", &tipo_cliente.num_conta);  //also accepts this value 
                                           //after pressing enter goes to a empty line
printf ("Saldo da conta:");
scanf ("%f ", &tipo_cliente.saldo);  //the value stored in this variable is the 
                                       // value entered in the previous empty line
tipo_cliente.dia_d_mes.dia = st.wDay;
tipo_cliente.dia_d_mes.mes = st.wMonth;
tipo_cliente.dia_d_mes.ano = st.wYear;

return tipo_cliente;            // return pointer

}

2 个答案:

答案 0 :(得分:1)

input_cliente返回指向函数内声明的变量的指针。但是,一旦函数结束,该变量的内容将变为未定义。您应该返回实际的struct cliente(不是指针)或使用mallocstruct cliente*分配内存,该内存将超出函数的执行范围。

答案 1 :(得分:1)

此处n是函数input_cliente局部变量。因此n的范围仅限于函数体。函数返回后它将无效。

所以你应该使用malloc在免费商店分配它:

struct cliente* tipo_cliente = (struct cliente*) malloc(sizeof(struct cliente));

或者让函数有一个out参数:

struct cliente* input_cliente(struct cliente* tipo_cliente)
{
     // fill tipo_cliente here.
}