为什么 strpbrk() 找不到字符?

Why doesn't strpbrk() find a character?

本文关键字:字符 找不到 strpbrk 为什么      更新时间:2023-10-16
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指向的字符。

你把自己弄糊涂了——这个程序就是用来弄糊涂的。

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

我个人避免使用strtok(),因为它会混淆输入字符串。如果你要使用它,你可能需要处理一个字符串的副本,因为strtok()在它上面写NUL字节。

最后的诊断输出应该只显示输入的第一部分——直到第一个操作符。

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


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

真的没有必要分配100字节的字符串:

char input[100];  // Cleaner, simpler, more reliable