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码,不是英语。例如,如果原始信息是法语,将摩尔斯电码转换为英语可能非常困难。:-)