scanf при чтении строки не дает ожидаемого результата - PullRequest
0 голосов
/ 02 апреля 2020

Я новый программист на C, и я борюсь с проблемами, связанными со строкой, у меня есть следующий код:

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <string.h>
#define MAXNOME 60


typedef struct aluno
{

    char codigo[5];
    char nome[MAXNOME];
    char cpf[11];
    char periodo[6];

} aluno;

void adicionaAluno(){

    aluno novoAluno;

    // adiciona codigo do aluno 
    printf("\nDigite o codigo do aluno: "); 
    scanf("%s", novoAluno.codigo);

    // adiciona cpf do aluno
    printf("\nDigite o CPF do aluno: ");
    scanf(" %s", novoAluno.cpf);

    printf("\nDigite o periodo do aluno: ");
    scanf(" %s", novoAluno.periodo);

    // adiciona nome do aluno
    printf("\nDigite o nome do aluno: ");
    scanf(" %[^\n]", novoAluno.nome);
    printf("%s\n", novoAluno.nome);
    printf("%s\n", novoAluno.cpf);
    printf("%s\n", novoAluno.codigo);
    printf("%s\n", novoAluno.periodo);
}

int main(){
    adicionaAluno();
    return 0;
}

Когда я запускаю его со следующим вводом:

Digite o codigo do aluno: 19404

Digite o CPF do aluno: 90998596272

Digite o periodo do aluno: 2020.1

Digite o nome do aluno: Bruno Mello

Я ожидаю, что он вернется:

Bruno Mello
90998596272
19404
2020.1

Но вместо этого он вернется:

Bruno Mello
909985962722020.1
19404Bruno Mello
2020.1

Я просто не могу понять, почему это происходит, может кто-то объяснить, почему этот код не работает и как я могу это исправить?

1 Ответ

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

char cpf [11]; должен содержать пробел также для завершающего символа '\ 0'. Таким образом, в вашем случае это должно быть не менее 12.

В памяти после cpf появляется период, который при сканировании переворачивает cpf [11], что совпадает с периодом [0], что приводит к печати 909985962722020.1. Обратите внимание, что то же самое относится и к periodo, только у вас нет другой переменной, которую вы переопределяете после нее.

...