while (getline(input, s)) {
//These are lower case letters.
while (s.find("a") != string::npos)
s.replace(s.find("a"), 1, "⠁");
while (s.find("b") != string::npos)
s.replace(s.find("b"), 1, "⠃");
while (s.find("c") != string::npos)
s.replace(s.find("c"), 1, "⠉");
while (s.find("d") != string::npos)
s.replace(s.find("d"), 1, "⠙");
while (s.find("e") != string::npos)
s.replace(s.find("e"), 1, "⠑");
while (s.find("f") != string::npos)
s.replace(s.find("f"), 1, "⠋");
while (s.find("g") != string::npos)
s.replace(s.find("g"), 1, "⠛");
while (s.find("h") != string::npos)
s.replace(s.find("h"), 1, "⠓");
while (s.find("i") != string::npos)
s.replace(s.find("i"), 1, "⠊");
while (s.find("j") != string::npos)
s.replace(s.find("j"), 1, "⠚");
while (s.find("k") != string::npos)
s.replace(s.find("k"), 1, "⠅");
while (s.find("l") != string::npos)
s.replace(s.find("l"), 1, "⠇");
while (s.find("m") != string::npos)
s.replace(s.find("m"), 1, "⠍");
while (s.find("n") != string::npos)
s.replace(s.find("n"), 1, "⠝");
while (s.find("o") != string::npos)
s.replace(s.find("o"), 1, "⠕");
while (s.find("p") != string::npos)
s.replace(s.find("p"), 1, "⠏");
while (s.find("q") != string::npos)
s.replace(s.find("q"), 1, "⠟");
while (s.find("r") != string::npos)
s.replace(s.find("r"), 1, "⠗");
while (s.find("s") != string::npos)
s.replace(s.find("s"), 1, "⠎");
while (s.find("t") != string::npos)
s.replace(s.find("t"), 1, "⠞");
while (s.find("u") != string::npos)
s.replace(s.find("u"), 1, "⠥");
while (s.find("v") != string::npos)
s.replace(s.find("v"), 1, "⠧");
while (s.find("w") != string::npos)
s.replace(s.find("w"), 1, "⠺");
while (s.find("x") != string::npos)
s.replace(s.find("x"), 1, "⠭");
while (s.find("y") != string::npos)
s.replace(s.find("y"), 1, "⠽");
while (s.find("z") != string::npos)
s.replace(s.find("z"), 1, "⠵");
//These are UPPER case letters.
while (s.find("A") != string::npos)
s.replace(s.find("A"), 1, "⠨⠁");
while (s.find("B") != string::npos)
s.replace(s.find("B"), 1, "⠨⠃");
while (s.find("C") != string::npos)
s.replace(s.find("C"), 1, "⠨⠉");
while (s.find("D") != string::npos)
s.replace(s.find("D"), 1, "⠨⠙");
while (s.find("E") != string::npos)
s.replace(s.find("E"), 1, "⠨⠑");
while (s.find("F") != string::npos)
s.replace(s.find("F"), 1, "⠨⠋");
while (s.find("G") != string::npos)
s.replace(s.find("G"), 1, "⠨⠛");
while (s.find("H") != string::npos)
s.replace(s.find("H"), 1, "⠨⠓");
while (s.find("I") != string::npos)
s.replace(s.find("I"), 1, "⠨⠊");
while (s.find("J") != string::npos)
s.replace(s.find("J"), 1, "⠨⠚");
while (s.find("K") != string::npos)
s.replace(s.find("K"), 1, "⠨⠅");
while (s.find("L") != string::npos)
s.replace(s.find("L"), 1, "⠨⠇");
while (s.find("M") != string::npos)
s.replace(s.find("M"), 1, "⠨⠍");
while (s.find("N") != string::npos)
s.replace(s.find("N"), 1, "⠨⠝");
while (s.find("O") != string::npos)
s.replace(s.find("O"), 1, "⠨⠕");
while (s.find("P") != string::npos)
s.replace(s.find("P"), 1, "⠨⠏");
while (s.find("Q") != string::npos)
s.replace(s.find("Q"), 1, "⠨⠟");
while (s.find("R") != string::npos)
s.replace(s.find("R"), 1, "⠨⠗");
while (s.find("S") != string::npos)
s.replace(s.find("S"), 1, "⠨⠎");
while (s.find("T") != string::npos)
s.replace(s.find("T"), 1, "⠨⠞");
while (s.find("U") != string::npos)
s.replace(s.find("U"), 1, "⠨⠥");
while (s.find("V") != string::npos)
s.replace(s.find("V"), 1, "⠨⠧");
while (s.find("W") != string::npos)
s.replace(s.find("W"), 1, "⠨⠺");
while (s.find("X") != string::npos)
s.replace(s.find("X"), 1, "⠨⠭");
while (s.find("Y") != string::npos)
s.replace(s.find("Y"), 1, "⠨⠽");
while (s.find("Z") != string::npos)
s.replace(s.find("Z"), 1, "⠨⠵");
//These is some french letters.
while (s.find("é") != string::npos)
s.replace(s.find("é"), 1, "⠿");
while (s.find("à") != string::npos)
s.replace(s.find("à"), 1, "⠷");
while (s.find("â") != string::npos)
s.replace(s.find("â"), 1, "⠡");
while (s.find("ç") != string::npos)
s.replace(s.find("ç"), 1, "⠯");
while (s.find("è") != string::npos)
s.replace(s.find("è"), 1, "⠮");
while (s.find("ê") != string::npos)
s.replace(s.find("ê"), 1, "⠣");
while (s.find("ë") != string::npos)
s.replace(s.find("ë"), 1, "⠫");
while (s.find("î") != string::npos)
s.replace(s.find("î"), 1, "⠩");
while (s.find("ï") != string::npos)
s.replace(s.find("ï"), 1, "⠻");
while (s.find("ô") != string::npos)
s.replace(s.find("ô"), 1, "⠹");
while (s.find("œ") != string::npos)
s.replace(s.find("œ"), 1, "⠪");
while (s.find("ù") != string::npos)
s.replace(s.find("ù"), 1, "⠾");
while (s.find("û") != string::npos)
s.replace(s.find("û"), 1, "⠱");
while (s.find("ü") != string::npos)
s.replace(s.find("ü"), 1, "⠳");
// These are numbers 0-9.
while (s.find("1") != string::npos)
s.replace(s.find("1"), 1, "⠼⠁");
while (s.find("2") != string::npos)
s.replace(s.find("2"), 1, "⠼⠃");
while (s.find("3") != string::npos)
s.replace(s.find("3"), 1, "⠼⠉");
while (s.find("4") != string::npos)
s.replace(s.find("4"), 1, "⠼⠙");
while (s.find("5") != string::npos)
s.replace(s.find("5"), 1, "⠼⠑");
while (s.find("6") != string::npos)
s.replace(s.find("6"), 1, "⠼⠋");
while (s.find("7") != string::npos)
s.replace(s.find("7"), 1, "⠼⠛");
while (s.find("8") != string::npos)
s.replace(s.find("8"), 1, "⠼⠓");
while (s.find("9") != string::npos)
s.replace(s.find("9"), 1, "⠼⠊");
while (s.find("0") != string::npos)
s.replace(s.find("0"), 1, "⠼⠚");
// These are punctuation marks
while (s.find(",") != string::npos)
s.replace(s.find(","), 1, "⠂");
while (s.find(";") != string::npos)
s.replace(s.find(";"), 1, "⠆");
while (s.find(":") != string::npos)
s.replace(s.find(":"), 1, "⠒");
while (s.find(".") != string::npos)
s.replace(s.find("."), 1, "⠲");
while (s.find("?") != string::npos)
s.replace(s.find("?"), 1, "⠦");
while (s.find("!") != string::npos)
s.replace(s.find("!"), 1, "⠖");
while (s.find("‘") != string::npos)
s.replace(s.find("‘"), 1, "⠄");
while (s.find("“") != string::npos)
s.replace(s.find("“"), 1, "⠄⠶");
while (s.find("”") != string::npos)
s.replace(s.find("”"), 1, "⠘⠴");
while (s.find("‘") != string::npos)
s.replace(s.find("‘"), 1, "⠄⠦");
while (s.find("’") != string::npos)
s.replace(s.find("’"), 1, "⠄⠴");
while (s.find("(") != string::npos)
s.replace(s.find("("), 1, "⠐⠣");
while (s.find(")") != string::npos)
s.replace(s.find(")"), 1, "⠐⠜");
while (s.find("/") != string::npos)
s.replace(s.find("/"), 1, "⠸⠌");
while (s.find("–") != string::npos)
s.replace(s.find("–"), 1, "⠤");
while (s.find("'") != string::npos)
s.replace (s.find("'"), 1, "⠄");
while (s.find("£") != string::npos)
s.replace (s.find("£"), 1, "⠘⠇");
while (s.find(".") != string::npos)
s.replace (s.find("."), 1, "⠲");
while (s.find("*") != string::npos)
s.replace (s.find("*"), 1, "⠔");
while (s.find("§") != string::npos)
s.replace (s.find("§"), 1, "⠐⠏");
while (s.find("&") != string::npos)
s.replace (s.find("&"), 1, "⠐⠿");
while (s.find("¥") != string::npos)
s.replace (s.find("¥"), 1, "⠘⠽");
while (s.find("€") != string::npos)
s.replace (s.find("€"), 1, "⠘⠑");
while (s.find("$") != string::npos)
s.replace (s.find("$"), 1, "⠘⠎");
while (s.find("©") != string::npos)
s.replace (s.find("©"), 1, "⠐⠉");
while (s.find("®") != string::npos)
s.replace (s.find("®"), 1, "⠐⠗");
while (s.find("™") != string::npos)
s.replace (s.find("™"), 1, "⠐⠞");
while (s.find("%") != string::npos)
s.replace (s.find("%"), 1, "⠐⠬");
while (s.find("‰") != string::npos)
s.replace (s.find("‰"), 1, "⠐⠬⠬");
while (s.find("‱") != string::npos)
s.replace (s.find("‱"), 1, "⠐⠬⠬⠬");
cout << s << endl;
}
好的,这是我到目前为止的代码,如果您注意到这完全是一发不可收拾,而且时间太长了。我并不是最擅长了解c ++中的函数,但我确实的确感觉到有一种更简单的方法可以使这100万倍的时间变得更短或更容易。有人可以为我解释或显示一个更简单的方法吗?我在这方面还很新,所以请使其尽可能简单,谢谢!为了理解这件漫长的事情,我希望程序读取文件中的内容,并希望将文件中的每个字符替换为我告诉它要替换的内容,就像我希望字母a被点替换一样。等等...然后将其显示为点。
答案 0 :(得分:2)
我可以针对您先前的问题发表评论。
首先,让我们看一下当前代码在外部循环中的作用。因此,您处于一个名为s
的字符串的位置,并且想要将每个字符转换为另一种形式(特别是其盲文形式,但是该细节不会影响逻辑)。为此,您(通过find()
)逐步遍历字符串的每个字符,直到找到'a'
。如果找到一个,则(再次调用find()
)逐步检查字符串的每个字符,直到找到一个'a'
并替换该字符。然后重复此操作:从字符串的开头再次开始,逐步浏览每个字符,直到找到'a'
。依此类推。
例如,给定字符串"gala"
,先查看'a'
,再查看'g'
,找到第一个'a'
。好的,有一个替代品。因此,先查看'a'
,再找到'g'
,找到第一个'a'
,然后替换为"g⠁la"
。现在,依次查看'a'
,'g'
,'⠁'
和'l'
,找到下一个'a'
。好的,有一个替代品。因此,先查看'a'
,'g'
,'⠁'
,然后查看'l'
,然后替换它,得到'a'
,找到下一个"g⠁l⠁"
。现在,依次查看'a'
,'g'
,'⠁'
和'l'
,找到下一个'⠁'
。哦,我们完成了。 ew。只需查看4个字符中的 16 !
完成'a'
的替换后,请对字母表中的每个字母重复此过程,然后再重复一些。如果您将这些说明提供给人类,那么他们充其量只能抱怨他们忙于工作。
如果必须手动执行此任务,该如何处理?您是否会寻找a并替换它们,还是会逐个字符地替换每个字符?大多数人会做后者。因此,让我们尝试告诉计算机使用这种方法。
首先实现“逐个字符”。有不同的方法可以做到这一点。出于指导目的,我将选择for ( auto it = s.begin(); it != s.end(); ++it )
。这导致变量it
从头到尾逐步遍历字符串,并在循环的每次迭代中依次指向每个字符。下一个任务是替换每个字符。这该怎么做?它并不简单,因此让我们将其推到另一个函数,称为to_braille
。并且由于某些替换项不止一个字符,因此构建新字符串可能更方便。有了这些决定,您的麻烦就变成了循环。
while (getline(input, s)) {
std::wstring braille;
for ( auto it = s.begin(); it != s.end(); ++it )
braille.append(to_braille(*it));
wcout << braille << endl;
}
别太兴奋。还有一个怪物函数要编写;这一切都摆脱了不必要的循环。尽管如此,monster函数还是相当简单的。这些评论提供了一些有关如何执行此操作的建议,但是作为起点,您可以只做一个怪物switch
。 (鉴于该功能将持续多长时间,我倾向于为其提供自己的源文件,因此您不必经常查看它。)
std::wstring to_braille(char c)
{
switch ( c )
{
case 'a': return L"⠁";
case 'b': return L"⠃";
case 'c': return L"⠉";
// And so on. You can write the rest.
}
// Unknown characters are not changed.
return std::wstring(1, c);
}
所有这些的主要目的是思考您想做什么;不要仅仅因为可以使用它们而选择工具。另外,分而治之。
注意:根据评论,我将正在构建的字符串从string
切换为wstring
。不过,我没有更改从文件读取的字符串。您可能需要检查程序以查看需要宽字符的地方。
答案 1 :(得分:1)
与其反复查找和替换,不如遍历输入字符串并在到达每个字符时查找每个字符的替换效率更高。我们可以将替换函数写为大switch
或表:
#include <map>
#include <string>
std::wstring to_braille(wchar_t c) noexcept
{
static const std::map<wchar_t, std::wstring> table = {
// lower case letters
{ L'a', L"⠁" }, { L'b', L"⠃" }, { L'c', L"⠉" }, { L'd', L"⠙" }, { L'e', L"⠑" },
{ L'f', L"⠋" }, { L'g', L"⠛" }, { L'h', L"⠓" }, { L'i', L"⠊" }, { L'j', L"⠚" },
{ L'k', L"⠅" }, { L'l', L"⠇" }, { L'm', L"⠍" }, { L'n', L"⠝" }, { L'o', L"⠕" },
{ L'p', L"⠏" }, { L'q', L"⠟" }, { L'r', L"⠗" }, { L's', L"⠎" }, { L't', L"⠞" },
{ L'u', L"⠥" }, { L'v', L"⠧" }, { L'w', L"⠺" }, { L'x', L"⠭" }, { L'y', L"⠽" },
{ L'z', L"⠵" },
// UPPER case letters
{ L'A', L"⠨⠁" }, { L'B', L"⠨⠃" }, { L'C', L"⠨⠉" }, { L'D', L"⠨⠙" }, { L'E', L"⠨⠑" },
{ L'F', L"⠨⠋" }, { L'G', L"⠨⠛" }, { L'H', L"⠨⠓" }, { L'I', L"⠨⠊" }, { L'J', L"⠨⠚" },
{ L'K', L"⠨⠅" }, { L'L', L"⠨⠇" }, { L'M', L"⠨⠍" }, { L'N', L"⠨⠝" }, { L'O', L"⠨⠕" },
{ L'P', L"⠨⠏" }, { L'Q', L"⠨⠟" }, { L'R', L"⠨⠗" }, { L'S', L"⠨⠎" }, { L'T', L"⠨⠞" },
{ L'U', L"⠨⠥" }, { L'V', L"⠨⠧" }, { L'W', L"⠨⠺" }, { L'X', L"⠨⠭" }, { L'Y', L"⠨⠽" },
{ L'Z', L"⠨⠵" },
// accented letters
{ L'é', L"⠿" }, { L'à', L"⠷" }, { L'â', L"⠡" }, { L'ç', L"⠯" }, { L'è', L"⠮" },
{ L'ê', L"⠣" }, { L'ë', L"⠫" }, { L'î', L"⠩" }, { L'ï', L"⠻" }, { L'ô', L"⠹" },
{ L'œ', L"⠪" }, { L'ù', L"⠾" }, { L'û', L"⠱" }, { L'ü', L"⠳" },
// digits
{ L'1', L"⠼⠁" }, { L'2', L"⠼⠃" }, { L'3', L"⠼⠉" }, { L'4', L"⠼⠙" }, { L'5', L"⠼⠑" },
{ L'6', L"⠼⠋" }, { L'7', L"⠼⠛" }, { L'8', L"⠼⠓" }, { L'9', L"⠼⠊" }, { L'0', L"⠼⠚" },
// punctuation
{ L',', L"⠂" }, { L';', L"⠆" }, { L':', L"⠒" }, { L'.', L"⠲" }, { L'?', L"⠦" },
{ L'!', L"⠖" }, { L'‘', L"⠄" }, { L'“', L"⠄⠶" }, { L'”', L"⠘⠴" }, { L'‘', L"⠄⠦" },
{ L'’', L"⠄⠴" }, { L'(', L"⠐⠣" }, { L')', L"⠐⠜" }, { L'/', L"⠸⠌" }, { L'–', L"⠤" },
{ L'\'', L"⠄" }, { L'£', L"⠘⠇" }, { L'.', L"⠲" }, { L'*', L"⠔" }, { L'§', L"⠐⠏" },
{ L'&', L"⠐⠿" }, { L'¥', L"⠘⠽" }, { L'€', L"⠘⠑" }, { L'$', L"⠘⠎" }, { L'©', L"⠐⠉" },
{ L'®', L"⠐⠗" }, { L'™', L"⠐⠞" }, { L'%', L"⠐⠬" }, { L'‰', L"⠐⠬⠬" }, { L'‱', L"⠐⠬⠬⠬" },
};
auto const it = table.find(c);
if (it == table.end())
return std::wstring{} + c; // fallback - use character unchanged
else
return it->second;
}
鉴于此,依次转换每个字符非常容易:
std::wstring to_braille(const std::wstring& s)
{
std::wstring braille;
braille.reserve(s.size()); // output is at least as big as input
for (wchar_t c: s)
braille += to_braille(c);
return braille;
}
演示:
#include <iostream>
#include <locale>
int main()
{
std::locale::global(std::locale{""});
std::wcout << to_braille(L"Hello World!");
}
⠨⠓⠑⠇⠇⠕ ⠨⠺⠕⠗⠇⠙⠖