如何在C

时间:2015-09-21 12:14:50

标签: c arrays replace char wchar

我在C中创建了一个程序,它可以替换或删除字符串中的所有元音。此外,我希望它适用于这些角色:'æ','ø','å'。

我曾尝试使用strstr(),但我没有设法实现它而不替换包含'æ','ø'或'å'的行上的所有字符。 我也读过wchar,但这似乎只是让一切变得复杂。

该程序正在使用这一系列字符:

char vowels[6] = {'a', 'e', 'i', 'o', 'u', 'y'};

我试过这个数组:

char vowels[9] = {'a', 'e', 'i', 'o', 'u', 'y', 'æ', 'ø', 'å'};

但它会发出以下警告:

  

警告:多字符字符常量[-Wmultichar]

     

警告:隐式常量转换溢出[-Woverflow]

如果我想用'a'替换每个元音,则用' a'替换'å'。

我也试过'{3}}'æ','ø'和'å'。

char extended[3] = {"\xc3\xa6", "\xc3\xb8", "\xc3\xa5"};

但它会出现此错误:

  

char数组初始值设定项中的多余元素

有没有办法让这项工作变得过于复杂?

2 个答案:

答案 0 :(得分:4)

有两种方法可以使该角色可用。第一个是code pages,它允许你use extended ASCII characters(值128-255),但代码页依赖于系统和语言环境,所以一般来说这是一个坏主意。

更好的选择是使用unicode。 unicode的典型情况是使用宽字符文字like in this post

wchar_t str[] = L"αγρω";

您的代码的关键问题是您正在尝试compare ASCII with UTF8, which can be a problem。解决方案很简单:将所有文字转换为宽字符UTF8等效项以及字符串。您需要使用通用编码而不是混合它,除非您有转换功能来帮助解决。

答案 1 :(得分:4)

了解UTF-8(包括与Unicode的关系)并使用一些UTF-8库:来自GTK的libunistringutfcppGlib,{ {3}} ....

您需要了解您使用的ICU

我强烈建议 character encoding在所有情况下(这是大多数Linux系统和几乎所有互联网和网络服务器的默认设置;请阅读UTF-8& {{3 }})。 阅读locale(7) ....

我不建议wchar_t的宽度,范围和符号是特定于实现的(您无法确定Unicode是否适合wchar_t;有传言说在Windows上它不适合)。将UTF-8输入转换为Unicode / UCS4也很耗时,不仅仅是处理UTF-8 ......

请理解,在UTF-8中,字符可以用几个字节进行编码。例如,ê(法语强调utf8(7)小写)以两个字节0xc3, 0xaa编码,ы(俄语utf8everywhere小写)编码为两个字节0xd1, 0x8b,两者都被认为是元音,但两者都不适合char(你和我的机器上的8位字节)。

e circonflexe的概念很复杂(例如俄语,阿拉伯语,日语,希伯来语,切诺基语,印地语等元音是什么元素),所以可能没有简单的解决方案来处理你的问题(因为UTF) -8有yery)。

您确定æœ是字母还是元音? (FWIW,å&amp; œ&amp; æ在Unicode中被分类为字母和小写字母)。我在法语小学被教导他们是vowel(法语词典并没有将它们称为字母,因此œuf位于oeuf的字典中,这意味着< EM>蛋)。但我不是这方面的专家。请参阅combining characters

在Linux上,由于UTF-8是默认编码(并且在最近的发行版中越来越难以获得其他版本),我不建议使用wchar_t,而是使用UTF-8 {{1 (例如,处理多字节编码的UTF-8的函数)(使用ligatures UTF8和Unicode函数):

char

我不确定我的功能名称是否正确;但是你在评论中告诉我,Norvegian(我不知道)没有比我的功能更多的元音字符。

我故意将UTF-8放在文字字符串或宽字符文字中(仅在注释中)。还有其他过时的字符编码(阅读strcoll(3)Glib),您可能希望交叉编译代码。