void kod()
{
setlocale(LC_ALL,"swedish");
locale swedish("swedish");
locale::global(swedish);
char vokal[9] = {'a','o','u','å','e','i','y','ä','ö'};
char konsonant[20] = {'b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','z'};
char stor_konsonant[20] = {'B','C','D','F','G','H','J','K','L','M','N','P','Q','R','S','T','V','W','X','Z'};
string rovarsprak, ord;
cout << "Skriv in ett ord" << endl;
getline (cin,ord);
int n = ord.length();
for(int i = 0; i<n; i++)
{
for (int x = 0; x<20; x++)
{
if (vokal[x] == tolower(ord[i]))
{
rovarsprak = rovarsprak + ord[i];
}
else if(konsonant[x] == ord[i])
{
rovarsprak = rovarsprak + ord[i] + "o" + ord[i];
}
else if(stor_konsonant[x] == ord[i])
{
rovarsprak = rovarsprak + ord[i] + "O" + ord[i];
}
else if(' ' == ord[i])
{
rovarsprak = rovarsprak + " ";
}
else if(ord[i] == 'Ö')
{
cout << "Ö";
}
}
}
cout << rovarsprak << "\n" << endl;
}
我理解如果你不会讲瑞典语,该程序可能会令人困惑,所以我会尝试解释它
用户输入一个单词,程序通过单词进入“rövarspråket”,这意味着它会在所有辅音之间放置一个O,然后重复它,而元音不受影响。等,“Ber”成为“Boberor” 这一切都很好,但是当程序中有å,ä或ö时,它会将其删除,而不是将其保留在单词中。有人能帮助我吗?
答案 0 :(得分:2)
ä å ö和朋友不是单字节字符,UTF-8对非ASCII字符使用多字节字符。这就是你的代码失败的原因。
所以使用std::string
和UTF-8
解码库(Greg Kroah-Hartman引用了一个快速/最小的实现,这只是一个很小的头文件,由BjörnHöhrmann撰写)如果您需要单个字符或libiconv
用于真实交易。
答案 1 :(得分:1)
除了字符集问题,您的循环中出现错误。
你只有9个元音,但你假设你在循环中有20个元音。
for (int x = 0; x<20; x++)
{
// ...
if (vokal[x] == tolower(ord[i]))
如果x> = 9,则这是内存读取溢出。
更好的方法是创建3组字母,并检查每组。
#include <set>
//...
std::set<char> vokal = {'a','o','u','å','e','i','y','ä','ö'};
std::set<char> konsonant = {'b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','z'};
std::set<char> stor_konsonant = {'B','C','D','F','G','H','J','K','L','M','N','P','Q','R','S','T','V','W','X','Z'};
string rovarsprak, ord;
cout << "Skriv in ett ord" << endl;
getline (cin,ord);
int n = ord.length();
for(int i = 0; i<n; i++)
{
if ( voka.find(tolower(ord[i])) != voka.end())
rovarsprak = rovarsprak + ord[i];
else
if(konsonant.find(ord[i]) != konsonant.end())
rovarsprak = rovarsprak + ord[i] + "o" + ord[i];
else
if(stor_konsonant.find(ord[i]) != stor_konsonant.end())
rovarsprak = rovarsprak + ord[i] + "O" + ord[i];
else
if( isspace(ord[i]))
rovarsprak = rovarsprak + " ";
else if(ord[i] == 'Ö')
cout << "Ö";
}
cout << rovarsprak << "\n" << endl;
}
给出关于字符集的其他答案,相应地更改上面的代码以具有正确字符类型的集合。基本大纲将是相同的。