char operators[] = "+-*/^(";
    char* input = new char[100];
    char* output = new char[100];
    char* operadores = new char[100];
    char* pch = input;
    char* pch2 = input;
    cout << "Expresion: " <<endl; cin.getline(input,100);
    cout << input <<endl;
    pch2 = strpbrk (pch2, operators);
    pch = strtok (pch, "+-*/^(");
    while (pch != NULL){
        strcat (output, pch);
        pch = strtok (NULL, "+-*/^(");
        strcat (operadores, pch2);
    }

    cout << "Salida: " << output <<endl;
    cout << "Operadores: " << operadores <<endl;
    cout << "Entrada: " << input <<endl;
    cout << "pch2 = " << pch2 <<endl;


嗨!我的问题是strpbrk函数不起作用,它不返回NULL,我已经证明了这一点。但是我需要一个char放在堆栈中,而cout不会告诉我pch2指向什么字符。

最佳答案

您正在使自己感到困惑-该程序旨在使您感到困惑。

您同时pchpch2指向相同的输入字符串-input。调用strpbrk()查找其中一个运算符,然后将该位置保存在pch2中。然后,在strtok()上调用pch,它将找到刚刚找到的strpbrk()字符,并在其上写入NUL '\0'。因此,看来pch2指向字符串末尾的NUL。然后,在循环的主体中,将pch2指向的空字符串连接到目标运算符列表上。

就我个人而言,我避免使用strtok()正是因为它会破坏输入字符串。如果要使用它,则可能需要处理字符串的重复项,因为strtok()会在该字符串上写入NUL字节。

您的诊断输出最后应显示输入的第一部分-直到第一位操作员-才可以。

当心在标准库函数或编译器“不起作用”上的转换散布。它是一个tyro的印记;在99.9999%的时间内,这是用户错误而不是系统错误。在那些非常非常非常正确的情况下(您看对了-哦,我刚刚赢得了我的第三百万张彩票大奖;即使我不买彩票,这种可能性也更大),你描述的问题是不同的。您将这个问题描述为完全惊讶的事情之一;您记录工作测试用例;然后,您将解释所发现的边缘情况如何工作以及其结果-仍然不确定是代码中还是系统中的错误。



正如其他人所诊断的,您不会将operadores初始化为空字符串,因此将其串联会导致未定义的行为。

确实不需要分配100字节的字符串:

char input[100];  // Cleaner, simpler, more reliable

关于c++ - strpbrk不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5848911/

10-11 21:53