我已经得到了一些代码,可能会导致缓冲区溢出,因此我应该对其进行更改,以使这种情况不再发生。
原始代码为:
#include <stdio.h> // Include to use printf, scanf
int main()
{
// Define buffers to store user name and password
char username[16];
char password[16];
// Read username and password from user input
printf("Enter your name: ");
scanf("%s", username);
printf("Enter your password: ");
scanf("%s", password);
printf("[SHOUTING OUT LOUD] Hello, %s!\n", username);
return 0;
}
当然,您可以通过输入超过15个字符作为用户名来导致simplay溢出。要解决此问题,我将scanf
替换为fgets
:
printf("Enter your name: ");
fgets(username, sizeof(username), stdin);
printf("Enter your password: ");
fgets(password, sizeof(password), stdin);
printf("[SHOUTING OUT LOUD] Hello, %s!\n", username);
不再存在溢出问题,但是当用户名输入超过15个字符时,由于其他字符仍然在stdin中,因此密码的输入只是“跳过”了。
我可以使用fflush
或while ((getchar()) != '\n');
来解决此问题,但这仅在缓冲区“过度浮动”的情况下有效。如果输入的字符少于15个,程序将等待其他输入。
如何处理此问题,以防止溢出,但用户名和密码输入仍按预期工作?