我正在尝试创建一个函数来从一个文件中读取摩尔斯电码,将其转换为英文文本,将转换后的文本打印到终端,然后将其写入输出文件。这是一个艰难的开始...
#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
但是..我似乎无法想出一个好方法来测试文件中的下一个字符是否为空格。所以这对我来说非常困难。
我非常沮丧并用Google搜索想法,并发现了使用此算法的建议
循环
-strchr()用于SPACE或EOL
- 将空格前的字符复制到另一个字符串
- 使用strcmp()和循环来查找字母
- 测试SPACE的下一个角色
- 如果是这样,输出另一个空间
- 转向下一个莫尔斯角色
列出项目
ENDLOOP
但是,这种循环有点令人困惑。我会使用fgets()(我认为),但我不知道在长度参数中放什么。
无论如何,我很累,很沮丧。对于这个问题,我将不胜感激。如有必要,我可以提供更多代码。
答案 0 :(得分:1)
您的原始计划看起来不错。但是,当您检查缓冲区中的' '
时,您已经关闭了1。它在convert[i]
,而不是convert[i + 1]
。检测到空格时,不会发生循环内的i++
。
答案 1 :(得分:0)
我不会使用strchr()来复杂化。
你的一点伪代码
while(there is a next line){
tokens = strtok(line);
int i = 0;
while(tokens hasnext){
save to buffer}}
答案 2 :(得分:0)
如果您担心CPU时间,可以编写一个查找表来查找值,就像这样的开关:
case '.-': code = "A"; break;
case '-...': code = "B"; break;
case '-.-.': code = "C"; break;
用空格分割摩尔斯电码后发送不同的信息。和 - 组合到开关以获得原始角色。
我希望这有帮助。 最好的问候。