2017-04-21 87 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,則您的比較將按預期工作。