首页 > 解决方案 > 检测到 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,我该如何解决这个问题?

标签: clinuxvalidationgccinput

解决方案


char choice[2]; scanf("%s", choice);是一场等待发生的灾难。

输入缓冲区choice只有 2 个字符,因此字符串只能容纳 1 个字符。但是scanf允许在该位置放置任意数量的字符。因此,如果用户在按 Enter 之前输入了超过 1 个字符,这些额外的字符将存储在内存中,而不是存储它们。所以它会覆盖属于其他数据的内存,在这种情况下是你的堆栈帧。这是由堆栈粉碎检测器检测到的。一般来说,你可以覆盖任何东西,这总是很糟糕。

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


推荐阅读