Userinput не работает, когда я ввожу "..." - PullRequest
0 голосов
/ 09 февраля 2012

Я делаю азбуку слов и назад.Программа работает, за исключением одного случая, когда я набираю «...» в пользовательском вводе, а затем нажимаю пробел, он становится очень маленьким, и программа ничего не возвращает.Так, например, если я пытаюсь набрать ... чтобы вернуть 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;
}

Ответы [ 3 ]

2 голосов
/ 09 февраля 2012

Звучит так, как будто ваша консоль заменяет три периода на многоточие, как может сделать программа обработки текстов.Не уверен, как это исправить, кроме как для сканирования Unicode или любого значения, которое создает консоль:)

1 голос
/ 09 февраля 2012

Ваша консоль «услужливо» преобразует три символа периода (...) в виде многоточия (…), как это допускается стандартом Unicode. Поскольку вы используете std::string, (и я предполагаю, что Linux, так как Windows не делает этого), он должен конвертировать в UTF-8. Unicode-символом является кодовая точка U + 2026, которая в UTF-8 равна 0xE2 0x80 0xA6, или, как cstring "\xE2\x80\xA6".

Источник: «Юникод распознает серию из трех символов периода (U + 002E) как эквивалент совместимости (хотя и не канонический) горизонтальному многоточию». - http://en.wikipedia.org/wiki/Ellipsis

0 голосов
/ 09 февраля 2012

Я пробежал и заменил ваши вещи на std :: classes там, где это необходимо, и для меня жесткое кодирование входной строки "... ..." приводит к выводу "SS", так что ваш фактический перевод Морзе в порядке(при условии, что вы хотите, чтобы он отбрасывал пробелы) - но захват строки с помощью cin усекает ввод в пробел.

...