[英]strpbrk doesn't work
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;
嗨,我的问题是 function strpbrk 不起作用,它不返回 NULL。 我已经证明了,但是我需要一个字符来放入堆栈。 并且 cout 没有告诉我 pch2 指向什么字符。
你自己弄糊涂了——这个程序就是用来弄糊涂的。
pch
和pch2
都指向同一个输入字符串 - input
。 您调用strpbrk()
来查找其中一个运算符,将 position 保存在pch2
中。 然后在pch
上调用strtok()
,它会找到strpbrk()
刚刚找到的字符,并在其上写入 NUL '\0'
。 因此, pch2
似乎指向字符串末尾的 NUL。 然后,在循环体中,将pch2
指向的空字符串连接到目标运算符列表中。
就个人而言,我避免使用strtok()
正是因为它会破坏输入字符串。 如果要使用它,您可能需要处理字符串的副本,因为strtok()
会在其上写入 NUL 字节。
您最后的诊断 output 应该显示输入的第一部分 - 直到第一个操作员 - 仅限。
谨防对标准库函数或编译器“不工作”进行诽谤。 它是泰罗的标志; 99.9999% 的时间,这是用户错误而不是系统错误。 在那些非常、非常、非常罕见的情况下,你是正确的(哦,看 - 我刚刚中了第三个数百万彩票大奖;即使我不买彩票,这种可能性也更大),这样你描述的问题不一样。 你把这个问题描述为完全惊讶之一; 您记录工作测试用例; 然后你解释你发现的边缘情况应该如何工作以及结果 - 你仍然不确定它是你的代码还是系统中的错误。
正如其他人所诊断的那样,您不会将operadores
为空字符串,因此连接到它会导致未定义的行为。
真的没有必要分配 100 字节的字符串:
char input[100]; // Cleaner, simpler, more reliable
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.