我的C ++程序无法检查Å,Ä或Ö

时间:2014-12-29 11:20:11

标签: c++

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” 这一切都很好,但是当程序中有å,ä或ö时,它会将其删除,而不是将其保留在单词中。有人能帮助我吗?

2 个答案:

答案 0 :(得分:2)

ä å ö和朋友不是单字节字符,UTF-8对非ASCII字符使用多字节字符。这就是你的代码失败的原因。

所以使用std::stringUTF-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;
}

给出关于字符集的其他答案,相应地更改上面的代码以具有正确字符类型的集合。基本大纲将是相同的。