【问题标题】:strpbrk doesn't workstrpbrk 不起作用
【发布时间】:2011-05-01 14:12:52
【问题描述】:
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 指向的字符。

【问题讨论】:

  • 既然您已经证明strpbrk 不起作用,我建议您向您的编译器供应商提交一份错误报告。这是您发现的一个非常严重的故障。
  • 哦,我怀疑是编译器的错。显然,C/C++ 是被破坏的语言,任何人都不应该使用它们。 ;p
  • 更严重的是,strpbrk 显然不是这里的问题。问题在于你如何称呼它。您准备好接受涉及修复strpbrk 使用的解决方案了吗?我也想知道你为什么使用 C 字符串而不是 std::string。

标签: c++ string


【解决方案1】:

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

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

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

您最后的诊断输出应显示输入的第一部分 - 直到第一个操作员 - 仅限。

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


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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 2010-11-07
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    相关资源
    最近更新 更多