检测到C-Linux堆栈粉碎!用于验证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可以在该位置放置任意数量的字符。因此,如果用户在点击回车键之前输入了超过1个字符,那么这些额外的字符就会存储在不打算存储它们的内存中。因此,它会覆盖属于其他数据的内存,在本例中是堆栈帧。这是由堆砸检测器检测到的。一般来说,你可以覆盖任何东西,这总是不好的。

始终确保你保持在变量的限制范围内。因此,使用格式字符串%1s强制scanf忽略除第一个字符以外的所有字符。

#include <stdio.h>
#include <string.h>
int main()
{
char choice;
int score = 0;
puts("Q1. (Y or N) ");
do
{
printf("nEnter valid Input(Y or N) : ");
scanf(" %c",&choice);
}while (choice!='y'&&choice!='Y'&&choice!='n'&&choice!='N');
if(choice=='y'||choice=='Y')
{
score += 30;
}
puts("Q2. (Y or N) ");
do
{
printf("nEnter valid Input(Y or N) : ");
scanf(" %c",&choice);
}while (choice!='y'&&choice!='Y'&&choice!='n'&&choice!='N');
if(choice=='y'||choice=='Y')
{
score += 20;
}
puts("Q3. (Y or N) ");
do
{
printf("nEnter valid Input(Y or N) : ");
scanf(" %c",&choice);
}while (choice!='y'&&choice!='Y'&&choice!='n'&&choice!='N');
if(choice=='y'||choice=='Y')
{
score += 20;
}
printf("n%dn",score);
}

最新更新