繁体   English   中英

处理输入时意外冻结

[英]unexpected freeze while handling input

我一直在尝试处理用户可以选择的多个功能,但是由于某些原因,意外的输入不会引起开发的反应,而是冻结。

int main(){
    int done = 0, isModeValid = 1;
    char nextMode[15], *options[] = {"quit",  "test", "getASCII"};

    while(done == 0){
        cls();
        isModeValid = 0;
        text(1);
        currentOptions(options);
        gets(nextMode);
        int i = 0;
        for(i = 0; i < (sizeof(options)); i++){
            if(strcmp(nextMode, options[i]) == 0){
                 done = runMode(i);
                 break;
            }
            //Error seems to happen after this point
            if(strcmp(nextMode, options[i]) != 0 && i == sizeof(options)){
                cls();
                text(3);
                Sleep(750);
            }
        }
    }
    return 0;
}
void cls(){
    system("cls");
}

您正在调用未定义的行为。 sizeof产生参数的大小(以字节 / char单位),而不是数组的长度 因此,您要遍历比数组实际包含的元素更多的元素,并尝试访问超出其边界的元素。

使用sizeof(options) / sizeof(options[0])获得独立于每个条目类型的长度。

注意:声明数组为static将在调用main之前对其进行分配和初始化。 您的当前版本将在每次调用该函数时执行该操作。 尽管对main并不重要,但对于不止一次被调用的其他功能而言,它却具有重要意义。

要获取options的数字字符串,您需要(sizeof(options)/sizeof(options[0])) ,而不仅仅是sizeof(options) ...因此,您的for循环循环了很多次,并且您正在访问范围。

另外,您的第二个命令if永远不会执行,因为i永远也不会进入sizeof(options)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM