2016-11-13 4 views
0

Ich bin dabei, einen Chat-Bot zu erstellen, und ich experimentiere gerade an diesem Punkt. aber meine "wenn" -Befehle funktionieren nicht und wenn ich "moodToday" eingebe, springt es einfach direkt zum else-Befehl."if" und "else if" -Befehle funktionieren nicht in C++

(Großschreibung von „moodToday“ ist nicht der Fehler)

jede und alle Hilfe

#include <fstream> 
#include <cmath> 
using namespace std; 

int main() { 

    char name[50], moodToday[50]; 


    cout << "A few things you should know at this time..." << endl << "1. I can't process last names." << endl << "2. I can't process acronyms." << endl; 
    system("pause"); 
    cout << endl << endl << "What is your name?" << endl; 
    cin >> name; 
    cout << "Hello " << name << "." << endl << "How are you today?" << endl; 
    cin >> moodToday; 


    //can't figure this out... 
    if ((moodToday == "sad") || (moodToday == "bad") || (moodToday == "horrible")) { 
     cout << "That's not good." << endl << "Why are you feeling " << moodToday << "today?" << endl; 
    } 
    else if (moodToday == "good") { 
     cout << "Great!" << endl; 
    } 
    else { 
     cout << "I'm sorry, I don't undrestand that feeling." << endl; 
    } 


    system("pause"); 

    return 0; 

} 
+0

Bitte schreiben Sie die vollständige Fehlermeldung –

+0

Wichtiger Hinweis: Sie sind keine "Befehle", sie sind Flow-Control-Anweisungen oder allgemeiner gesagt, das ist eine 'if'-Anweisung mit einer' else'-Klausel. – tadman

+0

Häufige Leute! 4 Antworten! Dies beweist, dass die Frage gut und interessant ist, auch wenn das Thema nicht komplex ist. Sollte das nicht ein paar Upvotes verdienen? – Christophe

Antwort

1

Wenn Sie C++ tun, dann sollten Sie die alten C-Stil Puffer mit std::string und nicht sein.

#include <string> 

int main() { 
    std::string name, moodToday; 
} 

C++ Strings sind deutlich besser als C-Strings, da sie nicht über buffer overflow Probleme und lassen sich leicht im Vergleich zu ==.

Versuchen Sie auch, als Tipp using namespace std; zu vermeiden, da dies Namensraumkonflikte verursachen kann. So nervig es immer sein kann, std:: einzugeben, es macht deutlich, woher diese Klasse oder Vorlage stammt und wer dafür verantwortlich ist. Auf diese Weise sind Ihre eigenen Klassen und Vorlagen offensichtlich.

4

Um Zeichen-Arrays zu vergleichen, die Strings enthalten würde geschätzt Sie Standard-C-Funktionen wie std::strcmp erklärt verwenden sollten in Überschrift <cstring>. Zum Beispiel

#include <cstring> 

//... 

if (std::strcmp(moodToday, "sad") == 0) std::cout << "They are equal << std::endl; 

sonst in Aussagen wie diese

if ((moodToday == "sad")) /*...*/ 

dort verglichen werden zwei Zeiger: Der Zeiger auf das erste Zeichen des Arrays moodToday und den Zeiger auf das erste Zeichen des Stringliteral "sad" weil Arrays, die in Ausdrücken mit seltenen Ausnahmen verwendet werden, werden in Zeiger auf ihre ersten Zeichen konvertiert.

Berücksichtigen Sie dabei, dass die Nutzung des operator >> mit Zeichenfeldern unsicher ist

cin >> moodToday; 

Benutze stattdessen Memberfunktion getline wie diese

cin.getline(moodToday, sizeof(moodToday)); 

oder anstelle der Zeichen-Arrays Sie Standard-Klasse verwenden könnte std::string.

Betrachten Sie eine Möglichkeit, alle Buchstaben der eingegebenen Zeichenfolge in den Fall des Zeichenfolgenliterals zu konvertieren, bevor Sie sie vergleichen. Sie können dies mit den Standard-C-Funktionen tolower und toupper durchführen, die im Header <cctype> deklariert sind.

1

Verwenden Sie strcmp anstelle von == Operatoren. Wenn Sie moodToday als Zeichenfolgenobjekt definiert haben, dann würde == funktionieren.

1

Ähnlich wie Probleme in Java mit Vergleichen von Objektadressen, was Sie tun, vergleicht Speicheradressen. Daher möchten Sie strcmp (str1, "literal") == 0 verwenden, um zu sehen, ob sie gleich sind.

#import <cstring> 
if(strcmp(str1, "literal") == 0) dothis(); 
+0

In C, ja. In C++, nein. – tadman