为什么我不能使用“ fgets”来读取Struct元素的字符串?

加布里埃尔

我正在尝试使用struct创建一个类似于“ bank”的程序,但是当程序应该读取字符串(葡萄牙语中的变量“ nome”即名称)时,它完全忽略了我使用的“ fgets”这是我正在谈论的部分:

printf("\nNome: \n");
fgets(vet[cont+1].nome, sizeof(vet[cont+1].nome), stdin);

而且我非常确定,问题可能出在对象数组的动态分配上。请帮我解决这个问题,谢谢!

PS:对不起,但是代码是葡萄牙语(我的母语)。

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

/*
Programa realiza uma alocacao dinamica por meio 
de uma funcao que recebe a dimensao e retorna o vetor(ponteiro)
*/

struct CLIENTES
{
    int ano_nasc, cpf[11];
    float renda_m;
    char nome[50];
}; //Lista de Objetos

int main(void) 
{
    //Declaracao de Variaveis
    int cont=0, num, num_2, client, i, j;
    CLIENTES *vet;

    //Leitura de Dados
    printf("Digite o numero de Clientes: ");
    scanf("%d", &num);
    vet = (CLIENTES*)malloc(num*sizeof(int));
    printf("Digite os Dados do Cliente.");

    while (cont != num)
    {  
        printf("\nNome: \n");
        fgets(vet[cont+1].nome, sizeof(vet[cont+1].nome), stdin);
        printf("\nAno de Nascimento: ");
        scanf("%d", &vet[cont+1].ano_nasc);
        printf("\nCPF: ");
        scanf("%d", &vet[cont+1].cpf);
        printf("\nRenda Mensal: ");
        scanf("%d", &vet[cont+1].renda_m);
        cont++;
    }

    printf("\nDigite o numero do cliente que voce deseja conferir: ");
    scanf("%d", &num_2);
    for (i=0;i<num;i++)
    {
        if(num_2 == num)
        {
            printf("\nO que deseja saber sobre ele?\n");
            printf("1-Nome\n2-Ano de Nascimento\n3-CPF\n4-Renda Mensal\n\n\n");
            scanf("%d", &client);
            if (client == 1)
            {
                printf("Nome: %c", vet[num_2].nome );
            }
            else if(client == 2)
            {
                printf("Ano de Nascimento: %d", vet[num_2].ano_nasc );
            }
            else if(client == 3)
            {
                for(j=0;j<11;j++)
                {
                    printf("CPF: %d", vet[num_2].cpf[j]);
                }
            }
            else if(client == 4)
            {
                printf("Renda Mensal: %f", vet[num_2].renda_m );
            } 
        }
    }

    //Finalizando o Programa
    printf("\n\nFim do Programa!");
    getch();
    return 0;
}
萨胡

我看到的问题:

  1. 您在该行中分配了错误的内存量:

    vet = (CLIENTES*)malloc(num*sizeof(int));
    

    应该是:

    vet = malloc(num*sizeof(*vet));
    

    请参见是否强制转换malloc的结果?答案解释了为什么不应该转换的返回值malloc

  2. 您正在使用fgetsscanfscanf将换行符和其他空白字符留在流中。fgets之后立即调用when时fgets仅读取空白和换行符。您需要添加代码,以忽略调用之后scanf和之前的其余行fgets

    // Skip everything up to and including the newline.
    int c;
    while ( (c = getc(stdin)) != EOF && c != '\n');
    

    在那之后,

    fgets(vet[cont+1].nome, sizeof(vet[cont+1].nome), stdin);
    

    应该正确读取数据。

  3. 您在该行中使用了错误的值:

    scanf("%d", &vet[cont+1].cpf);
    

    cpf是上的数组int如果您只想阅读一本int,可以使用:

    scanf("%d", &vet[cont+1].cpf[0]);
    
  4. 您在该行中使用了错误的格式说明符:

    scanf("%d", &vet[cont+1].renda_m);
    

    它应该是:

    scanf("%f", &vet[cont+1].renda_m);
        // ^^ %f not %d
    
  5. 您使用错误的索引访问数组vet您在任何地方使用vet[cont+1]它都应该vet[cont]通过使用vet[cont+1],您没有使用数组的第一个元素vet[0],并且访问的内存超出了您通过访问分配的内存vet[num]

如果解决上述问题,则程序可能会运行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我的substr调用不能使用→字符?

来自分类Dev

为什么我不能使用字符串作为ID

来自分类Dev

为什么我们不能使用指向字符串的指针?

来自分类Dev

为什么我不能使用以下字符串构建?

来自分类Dev

为什么我不能使用cout在C ++中打印字符串值的数组?

来自分类Dev

为什么我不能使用以下字符串构建?

来自分类Dev

为什么我不能使用Google Apps脚本对带空格的字符串执行.split()?

来自分类Dev

为什么不能使用这样的struct?

来自分类Dev

为什么我不能使用键而不是索引 angular 2 来读取 json 数据?

来自分类Dev

为什么我不能使用方法setState()来数组元素

来自分类Dev

为什么不能使用此scanf函数读取输入字符串?

来自分类Dev

为什么我们不能使用scanf直接初始化struct中的变量?

来自分类Dev

在Oracle PL / SQL中,为什么我不能使用<< >>来命名块

来自分类Dev

为什么我不能使用通用类型来实现非通用签名

来自分类Dev

为什么我不能使用std :: unique_ptr来避免循环依赖?

来自分类Dev

为什么我不能使用Sass变量来定义CSS变量的值

来自分类Dev

为什么我们不能使用push方法来迭代javascript数组?

来自分类Dev

为什么我不能使用自己的DNS服务器来欺骗Facebook?

来自分类Dev

为什么我不能使用renice来增加流程的价值?

来自分类Dev

为什么我不能使用@Inject来注入SessionFactory,而@Autowired可以呢?

来自分类Dev

为什么我不能使用其完整路径来调用该程序?

来自分类Dev

Java-为什么我不能使用别名来枚举KeyStore中的证书?

来自分类Dev

为什么我不能使用 execl() 来运行 bash 脚本?

来自分类Dev

为什么我不能使用Angular-Router读取嵌套状态的$ stateParams?

来自分类Dev

为什么我不能使用XElement读取此XML值?

来自分类Dev

为什么我不能使用Angular-Router读取嵌套状态的$ stateParams?

来自分类Dev

为什么我不能使用Visual Studio在C语言中读取文本文件?

来自分类Dev

为什么我不能使用此循环无限地读取double?

来自分类Dev

为什么我不能使用jQuery定位图像元素

Related 相关文章

  1. 1

    为什么我的substr调用不能使用→字符?

  2. 2

    为什么我不能使用字符串作为ID

  3. 3

    为什么我们不能使用指向字符串的指针?

  4. 4

    为什么我不能使用以下字符串构建?

  5. 5

    为什么我不能使用cout在C ++中打印字符串值的数组?

  6. 6

    为什么我不能使用以下字符串构建?

  7. 7

    为什么我不能使用Google Apps脚本对带空格的字符串执行.split()?

  8. 8

    为什么不能使用这样的struct?

  9. 9

    为什么我不能使用键而不是索引 angular 2 来读取 json 数据?

  10. 10

    为什么我不能使用方法setState()来数组元素

  11. 11

    为什么不能使用此scanf函数读取输入字符串?

  12. 12

    为什么我们不能使用scanf直接初始化struct中的变量?

  13. 13

    在Oracle PL / SQL中,为什么我不能使用<< >>来命名块

  14. 14

    为什么我不能使用通用类型来实现非通用签名

  15. 15

    为什么我不能使用std :: unique_ptr来避免循环依赖?

  16. 16

    为什么我不能使用Sass变量来定义CSS变量的值

  17. 17

    为什么我们不能使用push方法来迭代javascript数组?

  18. 18

    为什么我不能使用自己的DNS服务器来欺骗Facebook?

  19. 19

    为什么我不能使用renice来增加流程的价值?

  20. 20

    为什么我不能使用@Inject来注入SessionFactory,而@Autowired可以呢?

  21. 21

    为什么我不能使用其完整路径来调用该程序?

  22. 22

    Java-为什么我不能使用别名来枚举KeyStore中的证书?

  23. 23

    为什么我不能使用 execl() 来运行 bash 脚本?

  24. 24

    为什么我不能使用Angular-Router读取嵌套状态的$ stateParams?

  25. 25

    为什么我不能使用XElement读取此XML值?

  26. 26

    为什么我不能使用Angular-Router读取嵌套状态的$ stateParams?

  27. 27

    为什么我不能使用Visual Studio在C语言中读取文本文件?

  28. 28

    为什么我不能使用此循环无限地读取double?

  29. 29

    为什么我不能使用jQuery定位图像元素

热门标签

归档