strpbrk不起作用

时间:2011-05-01 14:12:53

标签: c++ string

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,我已经证明了这一点。但我需要一个字符串放入堆栈,而cout不会告诉我pch2指向的是什么字符。

1 个答案:

答案 0 :(得分:1)

你自己很困惑 - 该计划旨在混淆。

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