gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 08:20:58 25 4
gpt4 key购买 nike

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 '\0' 在上面。因此,pch2 似乎指向字符串末尾的 NUL。在循环体中,然后将 pch2 指向的空字符串连接到您的目标运算符列表中。

就我个人而言,我避免使用 strtok() 正是因为它会破坏输入字符串。如果您要使用它,您可能需要处理字符串的拷贝,因为 strtok() 会在其上写入 NUL 字节。

最后的诊断输出应该只显示输入的第一部分 - 直到第一个运算符(operator)。

谨防对标准库函数或编译器“不工作”的诽谤。这是新手的标志; 99.9999% 的情况下,这是用户错误而不是系统错误。在那些非常、非常、非常罕见的情况下,当你是正确的(哦,看——我刚刚赢得了我的第三个数百万彩票奖金;这更有可能,即使我不买彩票),方式你描述的问题不一样。您将这个问题描述为非常惊讶的事情之一;您记录工作测试用例;然后你解释你发现的边缘情况应该如何工作以及结果——你仍然不确定它是你的代码还是系统中的错误。


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

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

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

关于c++ - 为什么 strpbrk() 找不到字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5848911/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com