2017-04-21 2 views
2

Problem gelöst: StringVariable [Position] (in diesem Fall Word [e]) gibt einen Wert aus, der als Char-Variablentyp und nicht als Zeichenfolgevariablentyp definiert ist. Danke Ihnen allen für Ihre Hilfe!String Comparison Issue (C++)

Wenn ich meinen Henker Spiel laufen bekomme ich folgende Fehlermeldung:

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

ich im Code kommentiert, wo diese Fehler Punkte auf und im Zusammenhang mit dem Problem in den Funktionen kopiert. Die Funktionen wurden dann in der main() - Funktion ausgeführt, um den Code zu vereinfachen.

Dieser Abschnitt des Codes soll prüfen, ob die Schätzung gleich dem Buchstaben im Wort ist. Lassen Sie mich wissen, wenn ich weitere Erklärungen geben muss.

Verwandte Code:

#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

Was 'G' soll sein? –

+0

Kannst du nicht ein [MCVE] präsentieren? – IInspectable

+0

@Guillaume Racicot G ist ein Buchstabe, den der Benutzer eingibt –

Antwort

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

In diesem Vergleichen G ist ein string und Word[e] ein Charakter in einem string ist. Es gibt keinen Operator, der die entsprechenden Vergleiche durchführt.

2

Die richtige Zeichenfolge Vergleich, dass Sie suchen, find aufgerufen:

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

Der Grund, warum Ihr Vergleich funktioniert nicht war, dass Sie Word [e] wurde eine character der Saite greifen und es wurde verglichen mit einer string Variable.

Gemessen an Ihrem Code sieht es so aus, als wollten Sie zählen, wie oft der Buchstabe in der Zeichenfolge angezeigt wird. Wenn Sie die Anzahl, wie oft der Buchstabe erscheint in der Zeichenfolge zählen wollte, dann können Sie die Suchfunktion wie folgt verwenden:

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

Sie sollten 'std :: string :: npos' anstelle von -1 verwenden. Die Funktion sagt, dass sie 'string :: npos' zurückgibt, wenn die Suche nicht erfolgreich ist. Es gibt nichts im Standard, das besagt, dass 'std :: string :: npos' den Wert -1 hat. –

+0

Es sagt auf [dieser Link] (http://www.cplusplus.com/reference/string/string/npos/), dass es gleich -1 ist. Aber du hast Recht, ich werde es ändern. –

+1

@ThomasMatthews - eigentlich (und leider) sagt der Standard, dass 'std :: string :: npos' -1 ist. Das war nicht in der ursprünglichen Version der String-Klasse (ich war einer der Co-Autoren), und es schlich sich später ein, während ich nicht schaute. Dennoch ist Ihr Punkt richtig: Verwenden Sie 'std :: string :: npos' für Klarheit. –

1

G eine Variable vom Typ String ist. Word ist auch eine Art von String. Wie Sie vielleicht bereits wissen, sind Strings nichts anderes als ein Array von Zeichen. Also zeigt Word [e] auf ein Zeichen der Wortzeichenfolge. So

if(G == Word[e]) 

Hier vergleichen Sie eine Zeichenfolge mit einem Zeichen. Aber C++ hat keine Ahnung, wie das geht! Ich meine, C++ weiß nicht, wie man den Ausdruck auswertet. Weil der Operator == zum Vergleichen einer Zeichenkette und eines Zeichens innerhalb der Zeichenklasse nicht überladen wird. Das Gleiche gilt für die Linie

if(G != Word[e]) 

Wenn Sie versuchen, herauszufinden, ob Word [e] Zeichen in der Zeichenfolge G erscheint, sollten Sie eine weitere Schleife laufen durch Zeichen des Strings G. suchen Zeichen Oder Sie verwenden Funktion finden.

+0

Danke, das hat sehr geholfen. Ich habe nicht bemerkt, dass das Zeigen auf die Stelle im String-Array es zu einem Zeichen geändert hat. –

0

Der Grund des Fehlers ist, weil Sie Zeichenfolge mit einem Zeichen vergleichen. Sie können ==,! =,>, < usw. auf Zeichen verwenden, aber sicher nicht Zeichenfolgen. Und auch die Saite G scheint leer zu sein. Hoffe, das hilft und korrigiert mich, wenn ich falsch liege! Glückliche Kodierung!

0

G ist string Typ aber Word[e] ist char Typ.Sie sollten Word[e] in String umwandeln, um sie mit G durch std::to_string zu vergleichen, oder verwenden Sie die Methode string::find mit G, um den Inhalt Word[e] in G zu finden.

0

Der Vergleich wird nicht so funktionieren. Sie müssen verstehen, was der Unterschied zwischen einem char und einem std::string ist. Eine Variable vom Typ char repräsentiert einen einzelnen Buchstaben. A char kann kein Mehrfachzeichen sein und darf nicht leer sein. Ist streng ein einziger Buchstabe. Nichts weniger, nichts mehr.

Ein std::string kann als verwaltetes Array von char gesehen werden. Die Größe kann 0 bis sehr groß sein. Dieser Typ setzt den Array-Zugriffsoperator [n] frei, und dieser Operator gibt ein Zeichen aus der Zeichenfolge an Position n zurück. Der Rückgabetyp lautet char.

Da G ein Eingabebuchstabe des Benutzers sein soll, empfehle ich Ihnen, G als char zu deklarieren. In der Tat wird es Ihr Problem lösen.

Der Grund dafür, dass eine Zeichenfolge nicht mit einem einzelnen Zeichen verglichen werden kann. Eine Saite ist so konzipiert, dass sie mit einer anderen ganzen Saite vergleichbar ist. Und ein Charakter kann mit einem anderen Integral, oder einfacher gesagt, einem anderen Char verglichen werden. Wenn Sie also den Typ G in char ändern, funktioniert Ihr Vergleich wie erwartet.