2016-12-17 5 views
0

私は今、私は、ユーザーがファイルbrain.txtに言うものは何でも書くためのロボットのための機能を持っているスペース

C++で小さなチャットボットプログラムを書いている前に、文字列のすべての部分を無視し、配置しますそれが記憶された順にファイル内の数字を表示します。続けて、ユーザー入力Grapefruitを入力すると、グレープフルーツを新しい行に置き、接頭辞として6を入れます。

0 suspect 
1 interest 
2 underwood 
3 interior 
4 bullet 
5 dog 

ボットは、すでに前のユーザ入力年代からを持っているメモリとユーザ入力を比較し、私はに必要な問題に遭遇しました。

ifstream brain ("projects/AI/brain.txt"); 
if (brain.is_open()) 
{ 
    while (getline(brain,memory)) 
    { 
     cout << "memory: " << memory << endl; 
     cout << "userinput: " << userinput << endl; 
     if (memory == userinput) 
      { 
       exists = true; 
       //if it exists, tell the user, and break 
       cout << "I know that already!" << endl; 
       break; 
      } 
     else { filepos++; } 

ユーザ入力は、彼らが同じ文字列じゃないと、それは、比較チェックが失敗するこれら二つを比較した場合grapefruitボットのメモリが6 grapefruitエルゴあるだった場合。

数字を文字列の一部として残しておき、読み上げる文字列の一部を選択して選択できるようにします。私はJSONなどに後でアップグレードするかもしれませんが、今のところこれをやりたいのです。

  • 私の最初の質問は、どのようにスペースの後まで文字列のすべてを無視できますか?ので、私のプログラムが正しくgrapefruit比較しますとgrapefruit代わり

  • 私の2番目の質問がある6 grapefruitの私は複数スペースをスキップして、複数のスペースが経過した後にのみ読み取ることができるように、私はこの機能を拡張することができますか?例えば

、文字列に: 6グレープフルーツ23 53 12 私は数53、そして他には何にアクセスしたいです。

これを改善する方法や、これを誤って実行した可能性がありますか?

これは、プログラムの起動時に実行時にタプルなどのベクトルが発生し、ファイルからのアクセスが停止する可能性があります。これは私が将来できることです。

+0

読む2つの文字列とこれがうまく素晴らしく働いた最初の –

答えて

0

文字列がstd:stringオブジェクトに格納されている場合は、findメソッド()を使用して、メモリ文字列に含まれる入力文字列を判断できます。

http://en.cppreference.com/w/cpp/string/basic_string/find

if (memory.find(userinput) != std::string::npos) 
{ 
       exists = true; 
       //if it exists, tell the user, and break 
       cout << "I know that already!" << endl; 
       break; 
} 

のstd ::文字列:NPOなどがこのケースでは一致が文字列の末尾の前に発見されなかったことを意味し、特殊文字として定義されます。

http://en.cppreference.com/w/cpp/string/basic_string/npos

+0

を捨てるので、あなたに感謝し、ボットは、今では2試合理解し、それのbrain.txtに文字列を再度追加しません。 string :: nposで少し詳しく説明できますか?その仕組みがわからない –

+0

しかし、string :: nposで少し詳しく説明できますか?それがどう機能するか分からず、私は自分のコードを理解するのが好きです。 また、今後、このような文字列を分割することなくこれを達成するためのより良い方法を知っていますか? ありがとうございます。 –

+0

@StrayJay将来、文字列表現をファイルに保持することができますが、メモリにロードするときは、番号が別のフィールドに格納されるように書式設定することを検討してください。各レコードにデータポイントを追加すると、構造を拡張できます。 –