【问题标题】:Function won't allow comparison of single chars in String - C++函数不允许比较字符串中的单个字符 - C++
【发布时间】:2012-02-03 16:28:32
【问题描述】:

我有一个名为 removeInelligibleCharsFromTargetName 的新函数。

void removeInelligibleCharsFromTargetName(string *targetName)
{
    for(int i = 0; i < targetName->length(); i++)
    {
        for(int j = 0; j < ineligibleChars.length(); j++)
        {
            if(targetName[i] == ineligibleChars[j])
                targetName[i] = '_';
        }
    }
}

问题是当我尝试在 if 循环中进行比较时,出现以下错误:

错误 C2678: 二进制 '==' : 未找到采用 'std::string' 类型的左侧操作数的运算符(或没有可接受的转换) 32> c:\program files\microsoft sdks\windows\v6.0a\include\guiddef.h(192): 在尝试匹配参数列表时可能是 'int operator ==(const GUID &,const GUID &)' '(std::string, char)'

但是把完全相同的嵌套循环放回我调用它的地方,而不是调用它工作正常的函数。

谁能告诉我它不能在函数中工作,但在函数外可以正常工作。毫无疑问,它是一个指针,但我不知道是什么。

【问题讨论】:

    标签: c++ pointers


    【解决方案1】:

    为什么要传递指向string 的指针?这真是个坏主意。传递参考。

    void removeInelligibleCharsFromTargetName(string& targetName)
    {
        for(int i = 0; i < targetName.length(); i++)
        {
            for(int j = 0; j < ineligibleChars.length(); j++)
            {
                if(targetName[i] == ineligibleChars[j])
                    targetName[i] = '_';
            }
        }
    }
    

    问题是当你有一个指针时,targetName[i]*(targetName+i) 是一样的。 这相当于对字符串数组进行索引。如果您没有字符串数组,这只会导致未定义的行为。您很幸运代码无法编译(无法将字符串与字符进行比较)并且编译器捕获了错误。如果它恰好编译,当你运行它时,你可能会观察到一些非常奇怪的行为。

    当您有一个string 或对一个的引用时,targetName[i] 会调用字符串上的operator[],它会索引到字符串并实际上给您一个字符。

    【讨论】:

    • 我想你发现了这个错误:)。
    【解决方案2】:

    将每次出现的targetName[i] 更改为(*targetName)[i]。或者,按照 R. Martinho Fernandes 的建议进行操作,传递引用而不是指针。

    【讨论】:

      【解决方案3】:

      targetName是指针时,这段代码

      if(targetName[i] == ineligibleChars[j])
          targetName[i] = '_';
      

      尝试从指针索引,就像它曾经是(指向)数组一样。要访问实际指向的字符串,您需要在索引到字符串之前取消引用指针

      if((*targetName)[i] == ineligibleChars[j])
          (*targetName)[i] = '_';
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-02
        • 2012-11-15
        • 1970-01-01
        • 1970-01-01
        • 2012-10-18
        • 1970-01-01
        • 1970-01-01
        • 2013-03-21
        相关资源
        最近更新 更多