相同的输入给出不同的输出?

Same input that gives different output?

提问人:Heng Wei 提问时间:12/5/2020 更新时间:12/5/2020 访问量:358

问:

我正在尝试编写一个函数,该函数将布尔方程作为其输入,并给出该方程的答案作为其输出。例如:

输入:(!T|T)&F

输出: F

但是,在某些情况下,(当有括号时,相同的输入有时会给出 True,有时会给出 False)。例如:

输入:(T|T)&T

有时给T,有时给F。我是编程新手,我不确定我是否完全理解内存是如何工作的,有人可以检查我的代码并解释发生了什么吗?

#include <iostream>
#include <cstring>
using namespace std;

bool boolFunc(char* input, long len){
    // Base cases
    if(len == 2 && *input == '!'){
        if(*(input+1) == 'T') return false;
        if(*(input+1) == 'F') return true;
    }
        
    else if(len == 1){
        if(*input == 'T')
            return true;
        else
            return false;
    }
    //
    else{
        for (long i = len-1; i >= 0; i--) {
            //for equations with '(' and ')'
            if(*(input + i) == ')'){
                for (long j = i-1; j >= 0; j--) {
                    if(*(input + j) == '('){
                        if(*(input + j - 1) == '&')
                            return boolFunc(input, j-1) && boolFunc(input+j+1, i-j-1);
                        else
                            return boolFunc(input, j-1) || boolFunc(input+j+1, i-j-1);
                    }
                }
            }
            
            if(*(input + i) == '&'){
                return boolFunc(input, i) && boolFunc(input+i+1, len-i-1);
            }
            if(*(input + i) == '|'){
                return boolFunc(input, i) || boolFunc(input+i+1, len-i-1);
            }
            
        }
    }
    return false;
}


int main(){
    
    char input[500] = {'\0'};
    cin.getline(input, 500);
    if(boolFunc(input,strlen(input)))
        cout << "T" << endl;
    else
        cout << "F" << endl;

    return 0;
}


C++ 递归 逻辑 布尔表达式

评论

3赞 chris 12/5/2020
编译会给我一个很大的内存错误(包括行号),用于您麻烦的输入。首先,使用调试器和清理程序输出来确定程序处于什么状态以及它是如何到达那里的,或者该状态是否有效而您忘记处理它。-fsanitize=address
0赞 Heng Wei 12/5/2020
好的,谢谢!我正在使用 Xcode,并且不太熟悉调试过程,您有什么我可以观看的教程推荐吗?
2赞 chris 12/5/2020
我个人没有使用过 Xcode,但它应该将 gdb 或 lldb 集成到更易于使用的 UI 中。但是,设置断点、单步执行代码、检查事物的值和导航调用堆栈等基本调试工具将使您在调试一般问题方面走得很远。Xcode 将有某种方法可以做到这一点,但我想任何类型的 Xcode 调试参考资料都会展示如何做到这一点。

答: 暂无答案