2015-09-15 3 views
6

ich diesen FehlerDereferenzierung String Iterator Erträge int

comparison between pointer and integer ('int' and 'const char *') 

Für den folgenden Code

#include <iostream> 
#include <sstream> 
#include <string> 

using namespace std; 

int main() 
{ 
    std::string s("test string"); 
    for(auto i = s.begin(); i != s.end(); ++i) 
    { 
     cout << ((*i) != "s") << endl; 
    } 
} 

Warum dereferencing der String Iterator eine int und nicht std::string ergeben?

+0

Sie sollten schreiben 'cout << ((* i)! = 'S') << endl;' (beachten Sie die einfachen Anführungszeichen). –

+0

Sie vergleichen ein Zeichen ('* i') mit einem Zeiger auf eine Zeichenfolge (' "s" '). Das kann nicht funktionieren. –

+0

Wenn Sie schon 'auto' verwenden, verwenden Sie bitte Range-for wie in' for (auto const & c: s) {cout << (c! = 'S') << '\ n'; } '? (Beachten Sie, dass Sie selten "endl" und am häufigsten '\ n' verwenden möchten) – TemplateRex

Antwort

8

Tatsächlich ergibt es keine int, es ergibt sich eine char (weil ein String-Iterator über die Zeichen in der Zeichenfolge iteriert). Da der andere Operand != ist kein char (es ist ein const char[2]), Standard-Promotions und Umwandlungen werden für die Argumente angewendet:

  • char zu int über integrierte Förderung gefördert wird
  • const char[2] zu const char* via Array umgewandelt -zu-Zeiger-Konvertierung,

Dies ist, wie man am int ankommen und const char* Operanden der Compiler über beschwert.

Sie sollten den dereferenzierte Iterator auf einen Charakter, nicht auf eine Zeichenfolge vergleichen:

cout << ((*i) != 's') << endl; 

"" umschließt eine Zeichenkette (Typen const char[N]), '' umschließt einen wörtlicher Charakter (Typ char).