尝试防止堆栈溢出时出现意外结果

时间:2013-09-19 08:00:09

标签: c security input buffer-overflow

我正在尝试通过指定变量的宽度来保护下面的字段,以便不会发生缓冲区溢出。我宁愿不使用fgets(),因为我试图在我给出的规范中写一些东西(使用scanf)。

代码如下:

char firstName[11], surName[21], job[16];

printf("Enter first name: ");
scanf("%10s", firstName);
printf("Enter surname: ");
scanf("%20s", surName);
printf("Enter job: ");
scanf("%15s", job);

所以对于这样的输入:

Enter first Name: UmbertoOverflow
/*surName gets skipped over*/
Enter job: janitor

我明白了:

First name: UmbertoOve
Surname: rflow
Job: janitor

它没有给我一个输入姓氏的机会,它只是填写了名字的其余部分。这对我来说似乎是缓冲区溢出,所以有没有一种方法可以使用scanf而不会得到这个结果?

2 个答案:

答案 0 :(得分:1)

首字母的

%10s只从输入字符串中读取前10个字符 - UmbertoOve - 并放入firstname。剩下的 - rflow - 仍然在程序的输入缓冲区中,scanf()的{​​{1}}接受这些字符。输入名字时按surname - 或'\n'作为终结符,并在Return - key中添加rflow

它不是缓冲区溢出,而是预期的行为。

答案 1 :(得分:1)

这不是缓冲区溢出。只是scanf以空格或换行符作为分隔符。因此,第一个scanf扫描10个字符,然后下一个继续扫描,直到找到空格或'\ n'。

使用

    scanf("%10s%*s", firstName);
    scanf("%20s%*s", surName);
    scanf("%15s%*s", job);