首页 > 解决方案 > scanf() 覆盖下一个变量

问题描述

我正在尝试从用户那里获得输入。

void InfoPrint(){
    char FirstName[20];
    char LastName[20];
    int BirthYear;
    printf("Input your First Name: ");
    scanf("%19s", FirstName);
    printf("\nInput your Last Name: ");
    scanf("%19s", LastName);
    printf("\nInput your year of birth: ");
    scanf("%4d", &BirthYear);
    printf("\n%s %s %d\n", FirstName, LastName, BirthYear);
}

为什么当我输入超过 19 个字符FirstNameLastName它会覆盖我的下一个变量时?

标签: cscanfbuffer-overflow

解决方案


这是因为输入缓冲区仍然包含将由下一次调用读取的字符scanf

因此,如果您输入了例如 30 个字符并按下了 Enter 键,那么前 19 个字符将在第一次调用scanf

scanf("%19s", FirstName);

剩下的 11 个字符将被 . 的第二次调用读取scanf

scanf("%19s", LastName);

或者例如,如果您将输入一个包含空格字符的字符序列,"Hello World!"那么第一次调用scanf将读取单词"Hello",第二次调用scanf将读取序列"World!"


推荐阅读