2016-04-13 39 views
2

我一直在努力获得一个简单的函数来工作,目的是传递一个字符,函数然后搜索ALPHABET字符串,然后如果找到字符,则返回索引字符串内的字符。找不到字符串中的'空格'字符

我有一个包含字母表一个基本恒定的,包括一个撇号和空格字符:

const string ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ.,’ "; 

现在我它接受一个字符作为一个参数的函数:

int charaPosition(string chara){ 

    transform(chara.begin(), chara.end(),chara.begin(), ::toupper); 

    int charaIndex = ALPHABET.find(chara, 0); 

    if (charaIndex != string::npos) { 

     return charaIndex; 

    }else{ 
     cout << "Not found" << endl; 
    } 
} 

功能被启动像这样:

cout << charaPosition("s") << endl; 

这一切工作正常到某一点,我f我传入A,函数返回0,B返回1等。但是如果我传入空格字符,它将返回31而不是29,如果我传入撇号字符,它只是不会被发现。

我会非常感谢任何人的帮助。

+0

http://stackoverflow.com/questions/15475744/string-find-is-not-finding-spaces < - 这是同样的问题,我相信。 – antiHUMAN

+0

有一个[mcve],我们可以简单地复制和粘贴到一个IDE将是很好的... –

+0

尝试使用7位ascii撇号而不是''' – Alderath

回答

1

你的问题是,不是ASCII码,它是Unicode。它占用了字符串中的多个字节。

  1. It all works fine up to a certain point, if I pass in A, the function returns 0, B return 1 etc:对,到这一点,它是所有ASCII,所以你必须每个字符1个字节,因此产生的所有指标意义;

  2. However if I pass in the space character, it returns 31 rather than 29:问题是占用3个字节(226 128 153)而不是1个字节,因为它是Unicode。您应该使用std::wstringwchar_t以使其正常工作,或者用'(ASCII 39)替换该字符。

  3. and if I pass in the apostrophe character, it just doesn't get found.:那撇号不是ASCII,所以你要搜索多个字节而不是单个字节。

+0

是否有自动将Unicode字符转换为其UTF-8编码格式以保存在std :: string中? –

+0

鉴于位数限制,UTF-8无法表示Unicode可以使用的所有字符。 FWIW,您可以使用UTF-8语言环境,但在许多情况下它不会对您有所帮助。当然,你仍然可以建立一些规则,例如用'''替换'''',用'c'替换'''等等,但我现在还记不得有这样的假设的工具。 – jweyrich

+0

我这样问是因为在** const string ALPHABET =“ABCDEFGHIJKLMNOPQRSTUVWXYZ。,'”**中,如果撇号在存储之前没有自动将Unicode代码点转换为UTF-8,它将如何占用3个字节的std :: string。 –