c - 检测到 C-Linux-Stack 崩溃!用于使用 while 循环验证输入
问题描述
int test()
{
char choice[2];
int score = 0;
puts("\nPlease ONLY answer with Y or N.\nQ1. (Y or N) ");
scanf("%s", choice);
while (strcmp(choice, "Y") && strcmp(choice, "y") && strcmp(choice, "n") && strcmp(choice, "N"))
{
printf("\nEnter valid Input(Y or N) : ");
scanf("%s", choice);
}
if (!strcmp(choice, "Y") || !strcmp(choice, "y"))
score += 30;
puts("Q2. (Y or N) ");
scanf("%s", choice);
while (strcmp(choice, "Y") && strcmp(choice, "y") && strcmp(choice, "n") && strcmp(choice, "N"))
{
printf("\nEnter valid Input(Y or N) : ");
scanf("%s", choice);
}
if (!strcmp(choice, "Y") || !strcmp(choice, "y"))
score += 20;
puts("Q3. (Y or N) ");
scanf("%s", choice);
if (!strcmp(choice, "Y") || !strcmp(choice, "y"))
score += 20;
return score;
}
当我调用它时,如果用户只输入 y Y n N,则代码可以正常工作,但如果用户输入任何其他内容,甚至一次,在问题结束时,我得到
stack smashing error detected
,我该如何解决这个问题?
解决方案
char choice[2]; scanf("%s", choice);
是一场等待发生的灾难。
输入缓冲区choice
只有 2 个字符,因此字符串只能容纳 1 个字符。但是scanf
允许在该位置放置任意数量的字符。因此,如果用户在按 Enter 之前输入了超过 1 个字符,这些额外的字符将存储在内存中,而不是存储它们。所以它会覆盖属于其他数据的内存,在这种情况下是你的堆栈帧。这是由堆栈粉碎检测器检测到的。一般来说,你可以覆盖任何东西,这总是很糟糕。
始终确保您保持在变量的范围内。因此,通过使用格式字符串强制scanf
忽略除第一个字符之外的所有字符%1s
。
推荐阅读
- google-cloud-platform - 更改 Google Compute Engine 的外部 IP 地理位置
- java - 等效于 NodeJS 的 Java AES-256 和 RSA 混合加密
- javascript - div内的Bootstrap触发器Dropdown给出错误
- android - 延迟触发的协程 GlobalScope
- sequelize.js - 使用 sequelize 插入时如何填充数据库默认值?
- facebook - 为什么显示“handleWindowVisibility:令牌 android.os.BinderProxy@c63b265 没有活动”?
- android - 在 Android Studio for Kotlin 中为视图创建代码检查
- r - 如何从使用 R 包 MICE 运行的模型中获取拟合值
- python - Celery 确认未注册的任务
- swift - 使导航栏清晰而没有颜色的问题?