2016-11-13 10 views
0

私はチャットボットを作ろうとしていますが、私はちょうどこの時点で実験しています。私の "if"コマンドは機能しません。そして、 "moodToday"と入力すると、elseコマンドだけがスキップされます。"if"と "else if"コマンドがC++で動作しない場合

(「moodToday」の総額がエラーではありません)

任意およびすべてのヘルプはあなたが宣言std::strcmpような標準C関数を使用する必要がある文字列を含む文字配列を比較するために

#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

完全なエラーメッセージを投稿してください –

+0

重要:「コマンド」ではなく、フロー制御文です。より一般的には、それは 'else'節付きの' if'文です。 – tadman

+0

普通の人! 4つの答え!これは、たとえ問題が複雑ではなくても、問題が良好で興味深いことを証明します。これはいくつかのupvotesに値するはずですか? – Christophe

答えて

1

古いCスタイルのバッファあなたは、C++をやっている、あなたはstd::stringを使用しなければならないとされていない場合。彼らはbuffer overflowの問題を持っていないと簡単に==と比較されているので

#include <string> 

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

C++文字列がC文字列よりも有意に優れています。

また、ヒントとして、using namespace std;が名前空間の競合を引き起こす可能性があるので避けてください。 std::と入力すると迷惑になりますが、そのクラスやテンプレートの元の場所とコード担当者のコード担当者が明確になります。あなたのクラスとテンプレートは明らかです。

4

をいただければ幸いですヘッダ<cstring>。この

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

のような文ではそれ以外の場合は例えば

#include <cstring> 

//... 

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

は二つのポインタを比較しているが:配列moodTodayの最初の文字と"sad"ので、リテラル文字列の最初の文字へのポインタへのポインタまれな例外を持つ式で使用される配列は、最初の文字へのポインタに変換されます。

は、文字配列とoperator >>の使用は危険な

cin >> moodToday; 

使用は、あなたが標準クラスを使用することができ

またはその代わりに文字配列のこの

cin.getline(moodToday, sizeof(moodToday)); 
などの代わりにメンバ関数 getlineであることを考慮してください std::string

入力された文字列を比較する前に、入力された文字列のすべての文字を文字列リテラルの大文字に変換する可能性を考慮してください。これは標準のC関数tolowertoupperをヘッダ<cctype>で宣言して使用することができます。

1

==の代わりにstrcmpを使用してください。

moodTodayを文字列オブジェクトとして定義した場合、==が機能します。

1

オブジェクトアドレスを比較するJavaの問題と同様に、メモリアドレスを比較しています。したがって、strcmp(str1、 "literal")== 0を使用して、それらが等しいかどうかを確認します。

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

Cでは、はい。 C++では、いいえ。 – tadman