【问题标题】:String Comparison Issue (C++)字符串比较问题 (C++)
【发布时间】:2017-09-18 17:24:09
【问题描述】:

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

当我运行 Hangman 游戏时,出现以下错误:

错误 2 错误 C2678: 二进制 '!=' : 未找到采用 'std::string' 类型的左操作数的运算符(或没有可接受的转换)

错误 1 ​​错误 C2678:二进制“==”:未找到采用“std::string”类型的左操作数的运算符(或没有可接受的转换)

4 IntelliSense:没有运算符“!=”与这些操作数匹配

3 IntelliSense:没有运算符“==”与这些操作数匹配

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

【问题讨论】:

标签: c++ c-strings


【解决方案1】:

您正在寻找的正确字符串比较称为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++;
}

【讨论】:

  • 您应该使用std::string::npos 而不是-1。该函数表示如果查找不成功,它将返回string::npos。标准中没有任何内容表明 std::string::npos 的值为 -1。
  • 它在this link 上说它等于-1。但你是对的,我会改变它。
  • @ThomasMatthews -- 实际上(不幸的是),标准确实说std::string::npos 是-1。那不在 string 类的原始版本中(我是合著者之一),后来它偷偷溜进来了,而我没有看。不过,您的观点是正确的:为了清楚起见,请使用 std::string::npos
【解决方案2】:
    if(G == Word[e])
...
    else if(G != Word[e])

在这些比较中,GstringWord[e]string 中的一个字符。没有运算符来执行相应的比较。

【讨论】:

    【解决方案3】:

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

    if(G == Word[e])
    

    在这里,您将字符串与字符进行比较。但是 C++ 不知道如何做到这一点!我的意思是 C++ 不知道如何评估表达式。因为用于比较字符串和字符的运算符 == 在字符串类中没有重载。这条线也一样

    if(G != Word[e])
    

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

    【讨论】:

    • 谢谢你,这帮助很大。我没有意识到指向字符串数组中的点会将其更改为字符。
    【解决方案4】:

    错误的原因是因为您将字符串与字符进行比较。您可以在字符上使用 ==、!=、>、

    【讨论】:

      【解决方案5】:

      Gstring 类型,但 Word[e]char 类型。您应该将Word[e] 转换为String 以通过std::to_stringG 进行比较,或者使用string::findG 的方法在G 中查找内容Word[e]

      【讨论】:

        【解决方案6】:

        比较不会那样工作。您需要了解charstd::string 之间的区别。 char 类型的变量代表一个字母。 char 不能是多个字符,也不能为空。严格来说是一个,单一的字母。不多也不少。

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-04
          • 1970-01-01
          相关资源
          最近更新 更多