我刚刚学习了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; }
我该怎么做才能解决这个问题?
解决方法
通常编码的东西非常复杂.另一方面,如果您只想要一个特定于您的编译器/平台的脏解决方案,而不是在您的代码中添加这样的东西:
printf("letter 0x%x is number %d\n",letter,letter_nr(letter));
它将为你的变音符号提供十六进制值.而不仅仅是在if语句中替换你的带有数字的字母.
编辑你说你总是得到98所以你的scanf从控制台得到98 + 97 = 195 = 0x3C.根据这个table,0x3C是UTF8序列的开始,用于普通的LATIN SMALL LETTER N WITH Latin1块中的东西.您使用的是Mac OS X?
编辑这是我最后的电话.相当hackery但它适用于我:)
#include <stdio.h> // scanf for for letter. Return position in Morse Table. // Recognises UTF8 for swedish letters. int letter_nr() { unsigned char letter; // scan for the first time,scanf("%c",&letter); if(0xC3 == letter) { // we scanf again since this is UTF8 and two byte encoded character will come scanf("%c",&letter); //LATIN SMALL LETTER A WITH RING ABOVE = å if(0xA5 == letter) return 26; //LATIN SMALL LETTER A WITH DIAERESIS = ä if(0xA4 == letter) return 27; // LATIN SMALL LETTER O WITH DIAERESIS = ö if(0xB6 == letter) return 28; printf("Unknown letter. 0x%x. ",letter); return -1; } // is seems to be regular ASCII return letter - 97; } // letter_nr int main() { while(1) { printf("Type a letter to get its position: "); int val = letter_nr(); if(-1 != val) printf("Morse code is %d.\n",val); else printf("Unknown Morse code.\n"); // strip remaining new line unsigned char new_line; scanf("%c",&new_line); } return 0; }