如何解决strpbrk不起作用
|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
都指向相同的输入字符串--3ѭ。您调用strpbrk()
查找其中一个运算符,并将该位置保存在pch2
中。然后,您在pch
上调用strtok()
,它会找到刚找到的ѭ4character的字符,并在上面写一个NUL\'\\0\'
。因此,pch2
似乎指向字符串末尾的NUL。然后,在循环的主体中,将pch2
指向的空字符串连接到目标运算符列表上。
就我个人而言,我避免精确地使用strtok()
,因为它会弄乱输入字符串。如果要使用它,则可能需要处理字符串的重复项,因为strtok()
会在该字符串上写入NUL字节。
您的诊断输出最后应显示输入的第一部分-直到第一位操作员-才可以。
提防在标准库函数或编译器中强制转换为“不起作用”。它是一个tyro的印记;在99.9999%的时间内,这是用户错误而不是系统错误。在那些非常正确的非常罕见的情况下(哦,看-我刚刚赢得了我的第三百万个彩票大奖;即使我不买彩票,这种可能性也更大)票),您描述问题的方式是不同的。您将这个问题描述为完全惊讶的事情之一;您记录工作测试用例;然后,您将解释所发现的边缘情况如何工作以及结果-并且您仍然不确定这是代码中还是系统中的错误。
正如其他人所诊断的那样,您不会将operadores
初始化为空字符串,因此将其串联会导致不确定的行为。
确实不需要分配100字节的字符串:
char input[100]; // Cleaner,simpler,more reliable
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。