试图将莫尔斯电码转换为英语。奋斗的

时间:2010-11-16 08:41:25

标签: c

我正在尝试创建一个函数来从一个文件中读取摩尔斯电码,将其转换为英文文本,将转换后的文本打印到终端,然后将其写入输出文件。这是一个艰难的开始...
#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搜索想法,并发现了使用此算法的建议

  1. 阅读一行
  2. 循环

    -strchr()用于SPACE或EOL - 将空格前的字符复制到另一个字符串
    - 使用strcmp()和循环来查找字母 - 测试SPACE的下一个角色 - 如果是这样,输出另一个空间 - 转向下一个莫尔斯角色

  3. 列出项目

  4. ENDLOOP

    但是,这种循环有点令人困惑。我会使用fgets()(我认为),但我不知道在长度参数中放什么。

    无论如何,我很累,很沮丧。对于这个问题,我将不胜感激。如有必要,我可以提供更多代码。

3 个答案:

答案 0 :(得分:1)

您的原始计划看起来不错。但是,当您检查缓冲区中的' '时,您已经关闭了1。它在convert[i],而不是convert[i + 1]。检测到空格时,不会发生循环内的i++

答案 1 :(得分:0)

我不会使用strchr()来复杂化。

  1. 在输入文件中循环读取一行
  2. 使用[strtok] [1]
  3. 标记行
  4. 循环标记并将单个字母保存(最佳附加)到缓冲区
  5. 关闭looops并打印
  6. 你的一点伪代码

    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;

用空格分割摩尔斯电码后发送不同的信息。和 - 组合到开关以获得原始角色。

我希望这有帮助。 最好的问候。