试图将莫尔斯电码转换为英文。挣扎
我想创建一个函数来从一个文件中读取摩尔斯代码,将其转换为英文文本,将转换后的文本打印到终端,并将其写入输出文件。这里有一个粗略的开始... #define TOTAL_MORSE 91
#define MORSE_LEN 6
试图将莫尔斯电码转换为英文。挣扎
void
morse_to_english(FILE* inputFile, FILE* outputFile, char morseStrings[TOTAL_MORSE][MORSE_LEN])
{ int i = 0, compare = 0;
char convert[MORSE_LEN] = {'\0'}, *buffer = '\0';
//read in a line of morse string from file
// fgets(buffer, //then what?
while(((convert[i] = fgetc(inputFile)) != ' ') && (i < (MORSE_LEN - 1)))
{ i++;
}
if (convert[i + 1] == ' ')
convert[i + 1] = '\0';
//compare read-in string w/morseStrings
for (i = 48, compare = strcmp(convert, morseStrings[i]); //48 is '0'
i < (TOTAL_MORSE - 1) && compare != 0;
i++)
{ compare = strcmp(convert, morseStrings[i]);
}
printf("%c", (char)i);
}
我已经初始化morseStrings的莫尔斯电码。 这是我现在的功能。它不起作用,我不确定采取什么方法。
我原来的算法的计划是这样的:1. Scan Morse code in from file, character by character, until a space is reached
1.1 save to a temporary buffer (convert)
2. loop while i < 91 && compare != 0
compare = strcmp(convert, morseString[i])
3. if (test ==0) print ("%c", i);
4. loop through this until eof
但..我似乎无法想到一个好办法以测试文件中的下一个字符是否为空格。所以这对我来说非常困难。
我很沮丧,一派的想法,并找到了一个建议,使用这种算法
- 阅读空间或EOL 线
-
环
-strchr() - 将空格前的字符复制到另一个字符串
- 使用strcmp()并循环查找字母 - 测试SPACE的下一个字符。
- 如果是这样,输出另一个空间 -Skip下一莫尔斯字符 列表项
ENDLOOP
但是,这个循环是一种混乱。我会使用fgets()(我认为),但我不知道要在length参数中放置什么。
无论如何,我很累,很沮丧。我希望对此问题提供任何帮助或见解。如有必要,我可以提供更多代码。
你原来的计划看起来不错。不过,当您在缓冲区中检查' '
时,您已经偏离了1。它在convert[i]
,而不是convert[i + 1]
。当检测到空间时,循环内部的i++
不会发生。
你是对的。我打印的字符也被一个字符打断,但这很容易修复。我认为,在文件扫描策略失效的情况下,我感到非常沮丧,我认为存在更大的问题。谢谢 – Nate 2010-11-16 09:05:50
我不会使用strchr()来复杂化。
- 循环遍历Inputfile中读取线
- 与[strtok的] [1]
- 回路记号化线通过令牌和单字母保存(最好附加)到缓冲器
- 靠近looops和打印
有点伪代码为ü
while(there is a next line){
tokens = strtok(line);
int i = 0;
while(tokens hasnext){
save to buffer}}
如果您担心的CPU时间,你可以写一个查找表中查找的数值,作为东西像这样的开关:
case '.-': code = "A"; break;
case '-...': code = "B"; break;
case '-.-.': code = "C"; break;
后您的空间分割的莫尔斯电码并发送diferent。和 - 组合到开关获取原始字符。
我希望这个帮助。 此致敬礼。
有趣的想法。不是'switch'语句限于十个例子吗? – Nate 2010-11-16 09:08:19
@SubniC,你只能打开整数值(包括单个字符),而不是字符串。此外,您提供的代码不会编译,因为您已将字符串放在单引号内,而单引号是用于字符。 – 2010-11-16 09:24:57
@Martin:这不是严格正确的--gcc允许你使用最多4个字符来定义整数常量,例如, 'const int x ='abcd';'你也可以使用这样的常量作为case标签,例如'案例'ABCD':'。莫尔斯字母表只使用4个元素作为字母字符,所以SubniC的上述建议可以用于AZ,但不幸的是你需要5个数字和更多的标点符号等。 – 2010-11-16 09:34:10
我想你是指ASCII,而不是英文。例如,如果原始邮件是法文的,那么将摩尔斯电码转换为英文可能会非常困难。 :-) – 2010-11-16 15:23:36
Touché,好的先生。 – Nate 2010-11-16 20:44:49