C++ strpbrk不';行不通 char运算符[]=“+-*/^(”; 字符*输入=新字符[100]; 字符*输出=新字符[100]; 角色*歌剧演员=新角色[100]; char*pch=输入; char*pch2=输入; cout

C++ strpbrk不';行不通 char运算符[]=“+-*/^(”; 字符*输入=新字符[100]; 字符*输出=新字符[100]; 角色*歌剧演员=新角色[100]; char*pch=输入; char*pch2=输入; cout,c++,string,C++,String,你把自己弄糊涂了-这个程序就是为了让你自己搞糊涂而设计的 您让pch和pch2指向同一个输入字符串-input。您调用strpbrk()查找其中一个运算符,将该位置保存在pch2中。然后在pch上调用strtok(),它会找到strpbrk()的字符刚刚找到,并在其上写入NUL'\0'。因此,pch2似乎指向字符串末尾的NUL。在循环体中,然后将pch2指向的空字符串连接到目标运算符列表中 就个人而言,我避免使用strtok(),正是因为它会损坏输入字符串。如果要使用它,可能需要处理字符串的副本

你把自己弄糊涂了-这个程序就是为了让你自己搞糊涂而设计的

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

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

最后的诊断输出应显示输入的第一部分(直到第一个操作员)

小心对标准库函数或编译器“不工作”进行诽谤。这是tyro的标志;99.9999%的时间,这是一个用户错误,而不是系统错误。在那些非常、非常、非常罕见的情况下,如果你是正确的(哦,看,我刚刚中了我的第三个数百万彩票;这更有可能,尽管我不买彩票),你描述问题的方式是不同的。你把这个问题描述为一个完全令人惊讶的问题;你记录了正在工作的测试用例;然后你解释了你发现的边缘用例应该如何工作以及结果——你仍然不确定它是你的代码还是系统中的一个bug


正如其他人诊断的那样,您不会将
歌剧
初始化为空字符串,因此连接到它会导致未定义的行为

实际上不需要分配100字节字符串:

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
不起作用,我建议你向你的编译器供应商提交一份错误报告。你发现了一个非常严重的错误。哦,我怀疑这是编译器的错误。很明显,C/C++是坏语言,任何人都不应该使用它们。
strpbrk
显然不是问题所在这里。问题在于您如何调用它。您是否准备好接受一个解决方案,其中包括修复您对
strpbrk
的使用?我还想知道为什么您使用C字符串而不是std::string。
char input[100];  // Cleaner, simpler, more reliable