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,只是您没有在它之后覆盖的另一个变量。
我是 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,只是您没有在它之后覆盖的另一个变量。