我刚刚学习 C 语言,并接到了一项作业,要求我们将纯文本翻译成莫尔斯电码,然后再翻译回来。 (我最熟悉 Java,所以请耐心等待我使用的术语)。
为此,我有一个包含所有字母字符串的数组。
char *letters[] = {
".- ", "-... ", "-.-. ", "-.. ", ".", "..-." etc
我编写了一个函数来返回所需字母的位置。
int letter_nr(unsigned char c)
{
return c-97;
}
这是可行的,但作业规范要求处理瑞典语变音字母 åäö。瑞典语字母与英语相同,最后都是这三个字母。我尝试检查这些,如下所示:
int letter_nr(unsigned char c)
{
if (c == 'å')
return 26;
if (c == 'ä')
return 27;
if (c == 'ö')
return 28;
return c-97;
}
不幸的是,当我尝试测试这个函数时,我得到了这三个函数的相同值:98。这是我的主要测试函数:
int main()
{
unsigned char letter;
while(1)
{
printf("Type a letter to get its position: ");
scanf("%c", &letter);
printf("%d\n", letter_nr(letter));
}
return 0;
}
我可以做什么来解决这个问题?
字符常量的编码实际上取决于您的区域设置。
最安全的选择是使用宽字符和相应的函数。您将字母表声明为const wchar_t* alphabet = L"abcdefghijklmnopqrstuvwxyzäöå"
,以及单个字符L'ö';
这个小示例程序对我有用(也在使用 UTF-8 的 UNIX 控制台上) - 尝试一下。
#include <stdlib.h>
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main(int argc, char** argv)
{
wint_t letter = L'\0';
setlocale(LC_ALL, ""); /* Initialize locale, to get the correct conversion to/from wchars */
while(1)
{
if(!letter)
printf("Type a letter to get its position: ");
letter = fgetwc(stdin);
if(letter == WEOF) {
putchar('\n');
return 0;
} else if(letter == L'\n' || letter == L'\r') {
letter = L'\0'; /* skip newlines - and print the instruction again*/
} else {
printf("%d\n", letter); /* print the character value, and don't print the instruction again */
}
}
return 0;
}
会话示例:
Type a letter to get its position: a
97
Type a letter to get its position: A
65
Type a letter to get its position: Ö
214
Type a letter to get its position: ö
246
Type a letter to get its position: Å
197
Type a letter to get its position: <^D>
据我所知,在 Windows 上,这不适用于 Unicode BMP 之外的字符,但这在这里不是问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)