-5

请问我该如何解决?我试图通过引用来执行此功能

int inserir_hospede(hospede *AddHos)
{
    FILE *cadastros_h;

    cadastros_h = fopen("Hospedes.dat","a");

    imprime_cabecalho();
    printf("INSERINDO CADASTRO\n\n");

    printf("Nome: ");
    gets(-> *AddHos.nome);

    fflush(stdin);

    printf("RG: ");
    gets(-> AddHos.rg);

    fflush(stdin);


    fwrite(&AddHos,sizeof(AddHos),1,cadastros_h);

    printf("\n\n\n\n\nPressione ENTER para 'SALVAR' e voltar ao menu principal.");
    getch();

    fclose(cadastros_h);
}
4

2 回答 2

2
gets(-> *AddHos.nome);

对于 C 编译器(或 C 程序员)来说,这是荒谬的。

gets

不要使用gets. 它没有针对缓冲区溢出的保护(潜在的分段错误、潜在的安全漏洞)。改为使用fgets(str, /* length of str */, stdin)

->

这不是任何类型的赋值运算符;它是间接成员访问运算符。ptr->foo== (*ptr).foo。(gets也不特别对待它;gets是一个正常的功能。)

fflush(stdin)

fflush仅适用于输出流。它对输入流有未定义的行为。一些实现可能会在输入流上赋予它语义,但这是非常非常不可移植的。只是不要这样做。

维修

我的帖子开头的代码行可能会更好地写成

fgets(AddHos->nome, sizeof(AddHos->nome), stdin); // assumes nome is a char[]

另一个gets可以重做为

scanf("%d", &AddHos->rg); // assumes rg is an int

scanf通常是错误的工作工具,即使在这里(不是的地方)也需要一些支持代码;但这应该是一个很好的起点。

于 2013-05-23T04:24:13.600 回答
0

为了给出明确的答案,请您在这里定义“hospede”

假设“hospede” typedef 是一个结构。

为此,gets(-> *AddHos.nome); 将其更改为:gets(AddHos->nome);

为此得到(-> AddHos.rg); 将其更改为:gets(AddHos->rg);

于 2013-05-23T04:19:45.533 回答