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指向的是什么字符。
答案 0 :(得分:1)
你自己很困惑 - 该计划旨在混淆。
您pch
和pch2
都指向相同的输入字符串 - 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