Случайное число при выделении структуры целое число (int) в C - PullRequest
0 голосов
/ 05 апреля 2020

Я динамически распределяю количество оперативной памяти, которое мне понадобится для моей программы. Работает нормально, пока не наткнулся на эту проблему. Это когда я набираю контент, который будет внутри моего единственного элемента, который находится внутри структуры, которая называется Integer, если я наберу, например, более 10 цифр (12345678912), он отправит меня обратно, совершенно другой число.
Вот мой код:

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

struct cadastro
{
char email[50];
char nome[20];
int idade;
int telefone;
};

int main()
{
int quantidade_cadastros;
int decisao = 1;

printf("\nQuantos cadastros deseja realizar?\n");
printf("Quantidade: ");
scanf("%d", &quantidade_cadastros);
getchar();

//Definindo a quantidade de cadastros que podem ser realizados no struct e o nome que sera usado para chamar o struct
struct cadastro *cad;
cad = NULL;

cad = malloc(quantidade_cadastros * sizeof(struct cadastro));

for (int i = 0; i < quantidade_cadastros; i++)
{
    printf("\nDigite o NOME da pessoa que sera inserida no indice %d: ", i);
    fgets(cad[i].nome, 20, stdin);
    printf("Digite o EMAIL da pessoa que sera inserida no indice %d: ", i);
    fgets(cad[i].email, 50, stdin);
    printf("Digite a IDADE da pessoa que sera inserida no indice %d: ", i);
    scanf("%d", &cad[i].idade);
    getchar();
    printf("Digite o TELEFONE da pessoa que sera inserida no indice %d: ", i);
    scanf("%d", &cad[i].telefone);
    getchar();
}

for (int i = 0; i < quantidade_cadastros; i++)
{
    printf("\nNOME: %s", cad[i].nome);
    printf("EMAIL: %s", cad[i].email);
    printf("IDADE: %d", cad[i].idade);
    printf("\nTELEFONE: %d", cad[i].telefone);
    printf("\n");
}

printf("\n");
free(cad);
}

Вот введенный мною ввод:

Quantos cadastros deseja realizar?
Quantidade: 2

Digite o NOME da pessoa que sera inserida no indice 0: Test1
Digite o EMAIL da pessoa que sera inserida no indice 0: Email1
Digite a IDADE da pessoa que sera inserida no indice 0: 19
Digite o TELEFONE da pessoa que sera inserida no indice 0: 1234567891

Digite o NOME da pessoa que sera inserida no indice 1: Test2
Digite o EMAIL da pessoa que sera inserida no indice 1: Email2
Digite a IDADE da pessoa que sera inserida no indice 1: 18
Digite o TELEFONE da pessoa que sera inserida no indice 1: 12345678912

NOME: Test1
EMAIL: Email1
IDADE: 19
TELEFONE: 1234567891

NOME: Test2
EMAIL: Email2
IDADE: 18
TELEFONE: -539222976

1 Ответ

3 голосов
/ 05 апреля 2020

Вы столкнулись с переполнением int. Второй набранный вами номер телефона больше, чем может хранить int, и вы не проверяете чтение. scanf, вероятно, потерпел неудачу и ничего не сохранил в int - что означает, что в его области памяти все еще есть случайные биты, поскольку вы никогда не очищали его. printf затем печатает эту случайную информацию.

Вы должны всегда проверять, что scanf был успешным - он вернет количество успешно назначенных полей, здесь 1. Поэтому вы должны использовать `if (scanf (...)! = 1) {/ обработать ошибку /}, а не игнорировать ее.

...