【问题标题】:scanf when reading string not giving expected result读取字符串时scanf未给出预期结果
【发布时间】:2020-04-02 14:03:25
【问题描述】:

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

我就是不明白为什么会这样,有人能解释一下为什么这段代码不起作用,我该如何解决?

【问题讨论】:

    标签: c string stdio


    【解决方案1】:

    char cpf[11];还应为终止字符“\0”保留空间。 所以在你的情况下,它应该至少是 12。

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

    【讨论】:

    • 谢谢!我习惯用python编码,不知道这些细微差别,我该如何修复代码?
    • 它的长度应该等于“你想在其中保存的最大字符串 + 1”。请参阅tutorialspoint.com/cprogramming/c_strings.htm 了解更多信息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 2016-01-30
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多