函数不允许比较字符串中的单个字符 - C++

Function won't allow comparison of single chars in String - C++

本文关键字:单个 字符 C++ 不允许 比较 字符串 函数      更新时间:2023-10-16

我有一个名为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):在尝试匹配参数列表"(std::string,char)"时,可能为"int operator==(const GUID&,const GUID&)"

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

有人能告诉我为什么它在函数中不起作用,但在函数外却很好。毫无疑问,它是一个指针,但我不知道是什么。

为什么要传递指向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[],它会索引到字符串中,并实际为您提供一个字符。

将每次出现的targetName[i]更改为(*targetName)[i]。或者,按照R·马丁尼奥·费尔南德斯的建议,传一个参考而不是一个指针。

targetName是指针时,此代码为

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

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

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