【问题标题】:scanf() overwrits next variablescanf() 覆盖下一个变量
【发布时间】:2021-11-28 22:48:54
【问题描述】:

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

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);
}

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

【问题讨论】:

  • int clear_rest_of_line(void) { int ch; while (((ch = getchar()) != EOF) && (ch != '\n')) /*void*/; return (ch == EOF); }
  • 在您的问题中,您写道:"it overwrites my next variable" -- 我强烈怀疑这种说法是否准确。请提供问题的minimal reproducible example 准确输入、预期输出和实际输出。这样的示例应该包括所有#include 指令和一个函数main

标签: c scanf buffer-overflow


【解决方案1】:

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

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

scanf("%19s", FirstName);

第二次调用scanf 将读取剩余的 11 个字符。

scanf("%19s", LastName);

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

【讨论】:

  • 所以你的意思是我应该手动清理缓冲区的其余部分?
  • @Gendozz 您应该以某种方式清理输入缓冲区或发出错误并要求用户重复输入。
  • 好的,我知道了!斯帕西博!
  • @Andreas Wenzel 对不起,答案已考虑
猜你喜欢
  • 2020-03-13
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-19
  • 2020-07-30
  • 1970-01-01
相关资源
最近更新 更多