2012-02-03 26 views
0

我有一个新的函数removeInelligibleCharsFromTargetName函数不允许比较字符串中的单个字符 - C++

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] = '_'; 
     } 
    } 
} 

问题是,当我尝试在如果环我得到以下错误的比较:

error C2678: binary '==' : no operator found which takes a left-hand operand of type 'std::string' (or there is no acceptable conversion) 32> c:\program files\microsoft sdks\windows\v6.0a\include\guiddef.h(192): could be 'int operator ==(const GUID &,const GUID &)' while trying to match the argument list '(std::string, char)'

但是把那个完全相同的嵌套循环回来,我把它而不是调用函数吧工作正常。

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

回答

5

你为什么把一个指针传递给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[]

+0

我认为您发现了该错误:)。 – 2012-02-03 16:33:47

+0

我真的不知道。周五晚上的晚上是我所有....... 谢谢 – discodowney 2012-02-03 16:35:25

0

targetName[i]的每次出现更改为(*targetName)[i]。或者,就像R.马蒂尼奥费尔南德斯建议并通过参考而不是指针一样。

0

targetName时是一个指针,该代码

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

尝试索引从指针,就像它已经(指针)的阵列。要访问实际指向的字符串,您需要在索引到字符串前取消引用指针

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