C ++ функция неверного чтения символа из строки - PullRequest
0 голосов
/ 03 декабря 2018

Я работаю над проектом, чтобы привыкнуть к использованию ООП в C ++.Программа должна взять произвольную строку из «input.txt» и вывести ее в «output.txt», переведенный в азбуку Морзе.Это будет работать, за исключением того, что некоторые символы интерпретируются как «.»вместо того, что должно быть.Я думаю, что показ кода имеет больше смысла.

Вывод при запуске:

Debug, untranslated: T
Debug, translated: -
Debug, untranslated: h
Debug, translated: ....
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: e
Debug, translated: .
Debug, untranslated:  
Debug, translated:  
Debug, untranslated: r
Debug, translated: .-.
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: e
Debug, translated: .
Debug, untranslated: d
Debug, translated: -..
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated:  
Debug, translated:  
Debug, untranslated: f
Debug, translated: ..-.
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: o
Debug, translated: ---
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: x
Debug, translated: -..-
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated:  
Debug, translated:  
Debug, untranslated: j
Debug, translated: .---
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: u
Debug, translated: ..-
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: m
Debug, translated: --
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: p
Debug, translated: .--.
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: s
Debug, translated: ...
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated:  
Debug, translated:  
Debug, untranslated: o
Debug, translated: ---
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: v
Debug, translated: ...-
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: e
Debug, translated: .
Debug, untranslated: r
Debug, translated: .-.
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated:  
Debug, translated:  
Debug, untranslated: t
Debug, translated: -
Debug, untranslated: h
Debug, translated: ....
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: e
Debug, translated: .
Debug, untranslated:  
Debug, translated:  
Debug, untranslated: b
Debug, translated: -...
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: r
Debug, translated: .-.
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: o
Debug, translated: ---
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: w
Debug, translated: .--
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: n
Debug, translated: -.
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated:  
Debug, translated:  
Debug, untranslated: d
Debug, translated: -..
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: o
Debug, translated: ---
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: g
Debug, translated: --.
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: 

Debug, translated: ?

input.txt:

The red fox jumps over the brown dog.

output.txt (заполняется после запуска):

-.???. .??.-?? .???-??-??? .???.??-?.???.?? -??.???..?? -.???. -???.??-??.??-? -??-??-????

main.cpp:

#include <iostream>
#include <string>
#include <fstream>
#include <unistd.h>
#include <string>
#include <sstream>
#include "morseTranslator.cpp"

using namespace std;

ifstream input("/Users/michaelsimanski/Documents/Projects C++/morse-coded/input.txt"); //init input controller
ofstream output("/Users/michaelsimanski/Documents/Projects C++/morse-coded/output.txt"); //init output controller

int main(int argc, char const *argv[])
{
  if (!(input.is_open() && input.good()))
  {
    cout << "ifstream is FUBAR, exiting";
  }
  else
  {
    cout << "ifstream is open and good, proceeding" << "\n"; //it is right and truly good

    std::stringstream fileContents; //init message, that will be filled by input.txt
    fileContents << input.rdbuf();

    output << morseTranslator::translate(fileContents.str());

    return 0;
  }

  return 0;
}

morseTranslator.cpp:

#include <iostream>
#include "morseTranslator.h"

using namespace std;

string morseTranslator::convertChar(char x) //converts a char to morse equivalent
{
  switch(x)
  {
    case ' ': return " ";
    case 'A':
    case 'a': return ".-";
    case 'B':
    case 'b': return "-...";
    case 'C':
    case 'c': return "-.-.";
    case 'D':
    case 'd': return "-..";
    case 'E':
    case 'e': return ".";
    case 'F':
    case 'f': return "..-.";
    case 'G':
    case 'g': return "--.";
    case 'H':
    case 'h': return "....";
    case 'I':
    case 'i': return "..";
    case 'J':
    case 'j': return ".---";
    case 'K':
    case 'k': return "-.-";
    case 'L':
    case 'l': return ".-..";
    case 'M':
    case 'm': return "--";
    case 'N':
    case 'n': return "-.";
    case 'O':
    case 'o': return "---";
    case 'P':
    case 'p': return ".--.";
    case 'Q':
    case 'q': return "--.-";
    case 'R':
    case 'r': return ".-.";
    case 'S':
    case 's': return "...";
    case 'T':
    case 't': return "-";
    case 'U':
    case 'u': return "..-";
    case 'V':
    case 'v': return "...-";
    case 'W':
    case 'w': return ".--";
    case 'X':
    case 'x': return "-..-";
    case 'Y':
    case 'y': return "-.--";
    case 'Z':
    case 'z': return "--..";
    default: return "?";
  }
}

string morseTranslator::translate(string toBeTranslated)
{
  string translatedText = ""; //string form of what is being translated

  for (int i = 0; i < toBeTranslated.length(); i++)
  {
    cout << "Debug, untranslated: " << toBeTranslated.at(i) << endl;
    cout << "Debug, translated: " << morseTranslator::convertChar(toBeTranslated.at(i)) << endl;
    toBeTranslated.replace(i, 1, morseTranslator::convertChar(toBeTranslated.at(i)));
  }
  return toBeTranslated;
}

morseTranslator.h:

#include <iostream>

using namespace std;

class morseTranslator
{
public:
  static string convertChar(char x);
  static string translate(string toBeTranslated);
};

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Ваша проблема исходит от

toBeTranslated.replace(i, 1, morseTranslator::convertChar(toBeTranslated.at(i)));

Вы попираете всю строку с этим, поскольку каждая следующая итерация анализирует то, что вы только что заменили в строку.Вам следует использовать translatedText в цикле, например

translatedText += morseTranslator::convertChar(toBeTranslated.at(i));

, а затем вы вернете translatedText из функции.В противном случае вам понадобится увеличить i на количество символов morseTranslator::convertChar(toBeTranslated.at(i)), добавленных в строку, чтобы вы пытались преобразовать то, что вы уже преобразовали.

0 голосов
/ 03 декабря 2018
toBeTranslated.replace(i, 1, morseTranslator::convertChar(toBeTranslated.at(i)));

изменит строку во время итерации, а convertChar отключит вставленные точки и тире.

Вам лучше присоединиться и вернуться translatedText.Похоже, вы в какой-то момент направлялись по этому маршруту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...