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指向什么字符。
最佳答案
您正在使自己感到困惑-该程序旨在使您感到困惑。
您同时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
关于c++ - strpbrk不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5848911/