字符串比较问题(C ++)

时间:2017-04-21 16:04:24

标签: c++ c-strings

解决问题:StringVariable [position](在本例中为Word [e])输出一个定义为char变量类型的值,而不是我预期的字符串变量类型。谢谢大家的帮助!

当我运行Hangman游戏时,我收到以下错误:

  

错误2错误C2678:binary'!=':找不到运算符,它接受类型为'std :: string'的左手操作数(或者没有可接受的转换)

     

错误1错误C2678:二进制'==':找不到运算符,它接受类型为'std :: string'的左手操作数(或者没有可接受的转换)

     

4智能感知:没有操作符“!=”匹配这些操作数

     

3智能感知:没有运算符“==”匹配这些操作数

我在代码中注释了此错误指向并复制到与问题相关的函数中。然后在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;
}

6 个答案:

答案 0 :(得分:2)

您正在寻找的正确字符串比较称为find

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

你的比较不起作用的原因是你的Word [e]抓取了一个character的字符串,并将其与一个string变量进行比较。

根据您的代码判断,您希望计算字母出现在字符串中的次数。如果你想计算字母出现在字符串中的次数,那么你可以使用这样的find函数:

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 :(得分:1)

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

在这些比较中,GstringWord[e]string中的字符。没有操作员可以进行相应的比较。

答案 2 :(得分:1)

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

if(G == Word[e])

在这里,您要将字符串与字符进行比较。但是C ++不知道该怎么做!我的意思是C ++不知道如何评估表达式。因为运算符==用于比较字符串和字符串不会在字符串类中重载。线路

也是如此
if(G != Word[e])

如果你试图找出G字符串中是否出现Word [e]字符,你应该运行另一个循环搜索字符串G的字符。或者你可以使用find函数。

答案 3 :(得分:0)

错误的原因是因为您要将字符串与字符进行比较。您可以在字符上使用==,!=,&gt;,&lt;等等,但肯定不是字符串。而且,字符串G似乎是空的。如果我错了,希望这有助于纠正我!快乐的编码!

答案 4 :(得分:0)

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

答案 5 :(得分:0)

比较不会那样。您需要了解charstd::string之间的区别。类型char的变量表示单个字母。 char不能是多个字符,也不能为空。严格来说是一个字母。没什么,仅此而已。

可以将std::string视为char的托管数组。它的大小可以是0到非常大。此类型公开数组访问运算符[n],该运算符从位置n的字符串返回一个字符。它的返回类型是char

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

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