C 正在尝试将摩尔斯电码转换为英语。挣扎

C 正在尝试将摩尔斯电码转换为英语。挣扎,c,C,我正在尝试创建一个函数,从一个文件中读取莫尔斯电码,将其转换为英文文本,将转换后的文本打印到终端,然后将其写入输出文件。这是一个艰难的开始… #定义总计\u摩尔斯91 #定义摩尔斯电码6 void morse_to_english(FILE* inputFile, FILE* outputFile, char morseStrings[TOTAL_MORSE][MORSE_LEN]) { int i = 0, compare = 0; char convert[MORSE_LEN] = {'

我正在尝试创建一个函数,从一个文件中读取莫尔斯电码,将其转换为英文文本,将转换后的文本打印到终端,然后将其写入输出文件。这是一个艰难的开始…
#定义总计\u摩尔斯91
#定义摩尔斯电码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);
}
3。如果(测试==0)打印(“%c”,i)
4。循环执行此操作,直到eof

但是。。我似乎想不出一个好方法来测试文件中的下一个字符是否是空格。所以这对我来说非常困难

我很沮丧,在谷歌上搜索了一些想法,并找到了使用这种算法的建议

  • 读一行
  • 环路

    -strchr()表示空间或EOL -将空格前的字符复制到另一个字符串
    -使用strcmp()和循环查找字母 -测试下一个字符的空格。
    -如果是,请输出另一个空格 -跳到下一个莫尔斯字符

  • 列表项

  • 端环

    但是,这个循环有点令人困惑。我会使用fgets()(我想),但我不知道在length参数中放什么


    不管怎样,我又累又沮丧。我将非常感谢对这个问题的任何帮助或见解。如果需要,我可以提供更多的代码

    你原来的计划看起来不错。但是,当您检查缓冲区中的
    '
    时,您将关闭1。它位于
    convert[i]
    ,而不是
    convert[i+1]
    。当检测到空间时,循环内的
    i++
    不会发生。

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

    我不会使用strchr()来表示复杂

  • 在输入文件中循环读取一行
  • 使用[strtok][1]标记行
  • 循环遍历标记并将单个字母保存(最好附加)到缓冲区
  • 关闭窗口并打印
  • 一点u的伪代码

    while(there is a next line){
    
    tokens = strtok(line);
    int i = 0;
    
    while(tokens hasnext){
    save to buffer}}
    
    我不会使用strchr()来处理复杂的问题

  • 在输入文件中循环读取一行
  • 使用[strtok][1]标记行
  • 循环遍历标记并将单个字母保存(最好附加)到缓冲区
  • 关闭窗口并打印
  • 一点u的伪代码

    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;
    
    在你把摩尔斯电码按空格分开并发送不同的信息之后。和-组合到开关以获得原始字符

    我希望这有帮助。
    致以最诚挚的问候。

    如果您关心CPU时间,您可以编写一个查找表来查找这些值,例如下面的开关:

    case '.-': code =  "A";  break;
    case '-...': code =  "B";  break;
    case '-.-.': code =  "C";  break;
    
    在你把摩尔斯电码按空格分开并发送不同的信息之后。和-组合到开关以获得原始字符

    我希望这有帮助。
    致以最诚挚的问候。

    你说得绝对正确。我正在打印的字符也减少了一个,但这很容易修复。我想,我真的很沮丧,因为文件扫描策略不起作用,我认为有一个更大的问题。谢谢你完全正确。我正在打印的字符也减少了一个,但这很容易修复。我想,我真的很沮丧,因为文件扫描策略不起作用,我认为有一个更大的问题。谢谢你的好主意。
    switch
    语句是否仅限于十种情况?@SubniC,您只能打开整数值(包括单个字符),而不能打开字符串。此外,您给出的代码无法编译,因为您将字符串放在单引号内,而单引号用于字符。@马丁:这不是严格正确的-gcc允许您使用最多4个字符定义整数常量,例如
    const int x='abcd'并且您还可以使用此类常量作为大小写标签,例如
    大小写'ABCD':
    。莫尔斯字母表仅使用4个元素表示字母字符,因此SubniC的上述建议适用于A-Z,但不幸的是,数字需要5个元素,标点符号等需要更多元素。我非常确定,根据标准,一个开关中至少可以有256个case。根据标准,一个开关中可以有257个case语句,1023如果你使用C99。这个主意很有趣。
    switch
    语句是否仅限于十种情况?@SubniC,您只能打开整数值(包括单个字符),而不能打开字符串。此外,您给出的代码无法编译,因为您将字符串放在单引号内,而单引号用于字符。@马丁:这不是严格正确的-gcc允许您使用最多4个字符定义整数常量,例如
    const int x='abcd'并且您还可以使用此类常量作为大小写标签,例如
    大小写'ABCD':
    。莫尔斯字母表仅使用4个元素表示字母字符,因此SubniC的上述建议适用于A-Z,但不幸的是,数字需要5个元素,标点符号等需要更多元素。我非常确定,根据标准,一个开关中至少可以有256个case。根据标准,一个开关中可以有257个case语句,如果你用C99,我想你指的是ASCII码,不是英语。例如,如果原始信息是法语,将摩尔斯电码转换为英语可能非常困难。:-)我想你指的是ASCII码,不是英语。例如,如果原始信息是法语,将摩尔斯电码转换为英语可能非常困难。:-)