2017-04-21 129 views
2

问题迎刃而解:StringVariable [位置](在此情况下字[E])输出被定义为char变量类型,而不是我的预期它字符串变量类型的值。感谢大家的帮助!字符串比较版本(C++)

当我跑我的刽子手游戏,我得到以下错误:

Error 2 error C2678: binary '!=' : no operator found which takes a left-hand operand of type 'std::string' (or there is no acceptable conversion)

Error 1 error C2678: binary '==' : no operator found which takes a left-hand operand of type 'std::string' (or there is no acceptable conversion)

4 IntelliSense: no operator "!=" matches these operands

3 IntelliSense: no operator "==" matches these operands

我在这个错误点,并在相关问题的功能复制的代码注释。然后函数在main()函数中运行以简化代码。

的这部分代码是为了检查猜测是否等于字的信。让我知道是否需要提供进一步的解释。

相关代码:

#include <iostream> 
#include <fstream> 
#include <string> 
using namespace std; 

//Functions 
void GrabWord(); 
void DiscoverLet(); 
void guess(); 

//Variables 
int NumL, Fl, F, count[10]; 
string G, Word; 

//Grab Word from .txt and define NumL 
void GrabWord() 
{ 
    //Grab Random Line from .txt 
    //Random Line >> Larray 
    Word = "short"; 
    NumL = Word.size(); 
} 

//Checks if Guess matches any letters 
void DiscoverLet() 
{ 
    for(int e = 0; e < NumL; e++) 
    { 
     //Error Points to the following two comparisons 
     if(G == Word[e]) 
     { 
      count[e] = 1; 
     } 
     else if(G != Word[e]) 
     { 
      Fl++; 
     } 
     else 
     { 
      cout << "Error: DiscoverLet(), G to Word[]\n"; 
     } 
    } 
    if(Fl == NumL) 
    { 
     F = F + 1; 
    } 
    Fl = 0; 
} 
+0

G应该是什么? –

+0

你不能提出[mcve]吗? – IInspectable

+0

@Guillaume Racicot G是用户输入的字母 –

回答

1
if(G == Word[e]) 
... 
    else if(G != Word[e]) 

在这些比较,GstringWord[e]处于string一个字符。没有操作员执行相应的比较。

2

正确的字符串比较,你正在寻找被称为find

if(Word.find(G) > std::string::npos) 
{ 
    count[e] = 1; 
} 
else 
{ 
    Fl++; 
} 

之所以你比较不工作是你字[E]被抓住串的character和它被相比string变量。

您的代码来看,它看起来像你想算的信出现在字符串中的次数。如果你想算的信出现在字符串中的次数,那么你可以使用查找功能是这样的:

int count = 0; 
int foundIdx = 0; 

for(int i = 0; i < NumL; i++) 
{ 
    foundIdx = Word.find(G, foundIdx+1); 

    if (foundIdx == std::string::npos) 
    { 
     break; 
    } 

    count++; 
} 
+1

您应该使用'std :: string :: npos'而不是-1。该函数表示如果查找不成功,则返回'string :: npos'。标准中没有什么说std :: string :: npos将具有-1的值。 –

+0

它在[此链接](http://www.cplusplus.com/reference/string/string/npos/)上说它等于-1。但是你是对的,我会改变它。 –

+1

@ThomasMatthews - 实际上(不幸的是),标准确实表示'std :: string :: npos'是-1。这不是字符串类的原始版本(我是合着者之一),并且在我没有看的时候它会潜入。不过,你的观点是正确的:为了清晰起见,使用'std :: string :: npos'。 –

1

G是一个String类型的变量。字也是一种字符串。因此,您可能已经知道字符串不过是字符数组。所以Word [e]指向Word字符串的一个字符。所以

if(G == Word[e]) 

在这里,你正在比较一个字符串与一个字符。但是C++不知道该怎么做!我的意思是C++不知道如何评估表达式。因为用于比较字符串和字符的运算符==不会在字符串类中重载。这同样适用于线

if(G != Word[e]) 

如果你想找出是否字[E]字符出现在G弦,你应该运行另一个循环由字符串的字符搜索字符G.或者你可以使用找到功能。

+0

谢谢,这有很大的帮助。我没有意识到指向字符串数组中的位置将其更改为char。 –

0

错误的原因是因为你比较字符串的字符。您可以使用==,!=,>,<等上的性格,但肯定不是字符串。而且,字符串G似乎是空的。希望这有助于纠正我,如果我错了!快乐的编码!

0

Gstring类型,但Word[e]char类型。您应该将Word[e]转换为String以与G对比std::to_string或使用方法string::findG来查找内容Word[e]G

0

比较不会那样工作。您需要了解charstd::string之间的区别。类型为char的变量表示单个字母。 A char不能是多个字符,并且不能为空。严格来说是一个单一的字母。没有什么比这更少的了。可以看作char的托管数组。它的大小可以是0到非常大。此类型公开数组访问运算符[n],该运算符从位置n处的字符串中返回一个字符。它的返回类型是char

由于G应该是来自用户的输入信件,我建议您将G声明为char。事实上,它会解决你的问题。

字符串无法与单个字符进行比较的原因。一个字符串被设计成与另一个字符串相媲美。一个角色可以与另一个整体进行比较,或者简单地说,就是另一个角色。因此,如果您将G的类型更改为char,则您的比较将按预期工作。