如何将C语言摩尔斯码解码代码的do-while转换为while循环
摩尔斯码解码循环转换方案(替换do-while(true)为带条件的while)
1. 改造read_morse_return_char函数
原函数通过do-while(true)无限循环,靠遇到空格/换行时return终止。我们可以将读取操作与循环终止条件绑定,用明确的边界控制循环:
static char read_morse_return_char(FILE *morse_file, struct hsearch_data *hashtable) { int read_char; // 持续读取直到遇到空格、换行或文件结束 while ((read_char = fgetc(morse_file)) != ' ' && read_char != '\n' && read_char != EOF) { morse_buff[morse_buff_idx++] = read_char; } // 处理文件结束的边界情况 if (read_char == EOF) { morse_buff_idx = 0; return '\0'; // 可根据需求替换为错误标记或其他处理 } // 遇到空格/换行时解码摩尔斯码 morse_buff[morse_buff_idx] = '\0'; morse_buff_idx = 0; ENTRY item = {.key = morse_buff}; return morse_char_to_roman_char(hashtable, item); }
2. 改造read_morse_display_word函数
原函数用do-while(true)加break终止循环,我们将读取操作放入while条件,靠EOF自然终止循环,同时调整最后单词的处理逻辑:
void read_morse_display_word(FILE *morse_file, struct hsearch_data *hashtable) { assert("NULL pointer passed as morse file" && morse_file != NULL); char word[WORD_BUFFER_SIZE]; int word_idx = 0; int read_char; // 循环读取直到文件结束 while ((read_char = fgetc(morse_file)) != EOF) { if (read_char == ' ') { // 处理单词分隔空格:输出当前单词并重置缓冲区 word[word_idx++] = ' '; word[word_idx] = '\0'; printf("%s", word); word_idx = 0; // 跳过第二个分隔空格(保持原逻辑) fgetc(morse_file); } else { // 填充摩尔斯码缓冲区并解码字符到单词缓冲区 morse_buff[morse_buff_idx++] = read_char; word[word_idx++] = read_morse_return_char(morse_file, hashtable); } } // 处理文件结束时剩余的未输出单词(与原逻辑保持一致,添加空格) if (word_idx > 0) { word[word_idx++] = ' '; word[word_idx] = '\0'; printf("%s", word); } printf("\n"); }
改造说明
- 完全移除了
do-while(true)和break语句,用明确的循环条件控制流程 - 补充了
read_morse_return_char的EOF处理,避免缓冲区异常 - 保留了原代码的核心逻辑:摩尔斯码缓冲区填充、空格分隔单词、终端输出格式
内容的提问来源于stack exchange,提问作者DirtyV
相关产品推荐
相关产品推荐

