2012-02-09 18 views
0

私は言葉を逆さにしています。プログラムは、1つのケースを除いて動作します。ユーザー入力に "..."と入力し、スペースを押すと極端に小さくなり、プログラムは何も返しません。だから、例えば私が入力してみるとSを返すのですが、入力しようとすると... ... SSの場合はうまくいきません。私はユーザの入力や地図を扱うためにスタンフォードライブラリを使用していますが、標準ライブラリを使用しても同じことが起こります。「...」と入力したときにユーザー入力が機能しません。

#include <iostream> 
#include <string> 
#include "console.h" 
#include "random.h" 
#include "map.h" 
#include "simpio.h" 

using namespace std; 


int main() { 
    string input = getLine("Please enter words or morse code"); 
    Map<string, string> toMorse; 
    toMorse.put("A", ".-"); 
    toMorse.put("B", "-..."); 
    toMorse.put("C", "-.-."); 
    toMorse.put("D", "-.."); 
    toMorse.put("E", "."); 
    toMorse.put("F", "..-."); 
    toMorse.put("G", "--."); 
    toMorse.put("H", "...."); 
    toMorse.put("I", ".."); 
    toMorse.put("J", ".---"); 
    toMorse.put("K", "-.-"); 
    toMorse.put("L", ".-.."); 
    toMorse.put("M", "--"); 
    toMorse.put("N", "-."); 
    toMorse.put("O", "---"); 
    toMorse.put("P", ".--."); 
    toMorse.put("Q", "--.-"); 
    toMorse.put("R", ".-."); 
    toMorse.put("S", "..."); 
    toMorse.put("T", "-"); 
    toMorse.put("U", "..-"); 
    toMorse.put("V", "...-"); 
    toMorse.put("W", ".--"); 
    toMorse.put("X", "-..-"); 
    toMorse.put("Y", "-.--"); 
    toMorse.put("Z", "--.."); 

    Map<string, string> toSentence; 
    for(char c0='A'; c0<='Z'; c0++) 
    { 
     string c=""; 
     c.append(1, c0); 
     //cout<<toMorse.get(c)<<endl; 
     toSentence.put(toMorse.get(c), c); 
    } 
    if(input[0]=='.' || input[0]=='-') 
    { 
     string toLetter; 
     for(int i=0; i<input.length(); i++) 
     { 
      if(input[i] != ' ' && i<input.length()-1) 
      { 
       toLetter.append(input.substr(i, 1)); 
      } 
      else if(input[i] != ' ' && i==input.length()-1) 
      { 
       toLetter.append(input.substr(i, 1)); 
       cout << toSentence.get(toLetter); 
      } 
      else 
      { 
       cout << toSentence.get(toLetter); 
       toLetter = ""; 
      } 
     } 
    } 
    else 
    { 
     for(int i=0; i<input.length(); i++) 
     { 

      if(toMorse.containsKey(input.substr(i,1))) 
      { 
       cout << toMorse.get(input.substr(i,1)) << " "; 
      } 
     } 
    } 
    return 0; 
} 
+0

ここであなたはdosを実行していますか? linux? – vulkanino

答えて

1

あなたのコンソールは、ユニコード標準で許されているように、3つのピリオド(...)を省略記号(...)として「有益に」変換します。 std::stringを使用しているので(WindowsはこれをしないのでLinuxと仮定します)、UTF-8に変換する必要があります。 Unicode文字はコードポイントU + 2026で、UTF-8では0xE2 0x80 0xA6、またはcstring "\xE2\x80\xA6"です。

ソース: "Unicodeは、水平の省略記号文字と互換性がある(標準ではありませんが)一連の3つのピリオド文字(U + 002E)を認識します。 -http://en.wikipedia.org/wiki/Ellipsis

+0

これはまさにこれをやっている。しかし、それを修正する方法はわかりません。 – mlstudent

+0

'toSentence.put(" \ xE2 \ x80 \ xA6 "、" S ");'?なぜ非標準地図を使用していますか? C++には既に1つあります! –

+0

私はこれらのスタンフォードcs106b演習をしており、彼らのライブラリを使用すると言います。 – mlstudent

2

あなたのコンソールのようなサウンドは、ワードプロセッシングプログラムのように、3つの楕円が動くように変化しています。どのようにUnicodeやコンソールが作成している値をスキャンする以外はこれを修正する方法はわかりません:)

0

私は実行し、あなたのものをstd :: classesで置き換えました。私は入力文字列をハードコードしています"... ..."の結果は "SS"の出力となり、モールの実際の翻訳は大丈夫です(空白を捨てることを前提にしています)。しかし、文字列をcinでキャプチャすると、スペースで入力が切り捨てられます。

+0

ああ、getline(cin、input)を使うとすべてうまく動作します - あなたはgetl​​ineを使いましたか? –

+0

ええ、その点では問題ありません。問題は、実際のコンソールが期間をelipsis実行に変更していることです。 – mlstudent

関連する問題