scanf 读取字符串时未给出预期结果

scanf when reading string not giving expected result

我是 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

我希望它会 return:

Bruno Mello
90998596272
19404
2020.1

而是 returns:

Bruno Mello
909985962722020.1
19404Bruno Mello
2020.1

我根本不明白为什么会这样,有人可以解释为什么这段代码不起作用吗?我该如何解决?

char cpf[11];对于终止符 '\0' 也应该保持 space。 所以在你的情况下它应该至少是 12.

在内存中,cpf 之后是 periodo,当扫描时覆盖 cpf[11],这与 periodo[0] 一致,导致看到 909985962722020.1 被打印出来。 请注意,这同样适用于 periodo,只是您没有在它之后覆盖的另一个变量。