【问题标题】:C++ function misreading character from stringC ++函数从字符串中误读字符
【发布时间】:2019-05-05 03:24:17
【问题描述】:

我正在做一个项目以习惯在 C++ 中使用 OOP。该程序应该从“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: ?

输入.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);
};

【问题讨论】:

  • 无关:#include "morseTranslator.cpp" 通常是一件坏事。您应该包含头文件并编译 cpp 文件。
  • @user4581301 是的,我知道,它是前一段时间调试时遗留下来的。
  • 我建议在default 语句处放置一个断点,然后运行你的程序。查看角色的价值。 :-)

标签: c++ string class methods


【解决方案1】:
toBeTranslated.replace(i, 1, morseTranslator::convertChar(toBeTranslated.at(i)));

将在您迭代时更改字符串,convertChar 会绊倒插入的点和破折号。

最好附加并返回translatedText。看起来你在某个时候正朝着这条路线前进。

【讨论】:

  • facepalm 自从我上次处理这个问题以来已经有一段时间了,我忘记了我在做什么并且使用了错误的变量。有时它需要另一双眼睛!谢谢!
【解决方案2】:

你的问题来自于

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

你用这个践踏整个字符串,因为每次下一次迭代都会解析你刚刚替换到字符串中的内容。你应该做的是在循环中使用translatedText,比如

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

然后你从函数返回translatedText。否则,您需要将 i 添加到字符串中的字符数量 morseTranslator::convertChar(toBeTranslated.at(i)) 增加,以便您尝试转换已转换的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多