我只是为了学习而解决简单的问题。任务:用莫尔斯码对给定的字符串进行编码,返回编码后的字符串。问题:在莫尔斯码中,当字符串被拆分为标记时,表示单词之间有1个空格的3个空格丢失。
结果应为:“嘿,犹大”当前结果:“H EYJ U D E”
在解决方案中,我的方法改变了三次
- 我是从原来的msg和词汇一个接一个地迭代所有的符号
- 我正在构建一个有7个状态的状态机,最后我找到了从我的Angular 来看最好的方法。
- 将给定的字符串拆分为标记,然后与具有词汇表的strcmp进行比较
但问题是,在使用strtok进行分割的过程中,我丢失了3个空格,这3个空格应该是编码过程中我应该把空格放在哪里的“指针”。我想出了这个问题的解决方案-检查find_space_positions函数。但它的工作不完全正确,我不明白为什么。
请帮助我理解为什么find_space_positions不能正常工作?如何让它按照我想要的方式工作?
在C中做这些事情的更好方法是什么?
代码如下:
#include <stdlib.h>
#include <stdbool.h>
#include <stdint.h>
#include <string.h>
#include<stdio.h>
const char *morse[55] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.", ".-.-.-", "--..--", "..--..", ".----.", "-.-.--", "-..-.", "-.--.", "-.--.-", ".-...", "---...", "-.-.-.", "-...-", ".-.-.", "-....-", "..--.-", ".-..-.", "...-..-", ".--.-.", "...---..."};
const char *ascii[55] = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", ",", "?", "'", "!", "/", "(", ")", "&", ":", ";", "=", "+", "-", "_", "\"", "$", "@", "SOS"};
char input[] = ".... . -.-- .--- ..- -.. .";
static uint16_t msg_iter = 0;
static uint16_t voc_word_iter = 0;
static uint16_t voc_word_chr_iter = 0;
static uint16_t iter = 0;
static char buf[20] = "";
bool find_space_positions (const char* morse_code, uint16_t token_counter, uint16_t len ) {
uint16_t space_counter = 0;
for (uint16_t i = 0; i <len; i++){
printf("%c\n", morse_code[i]);
if (morse_code[i] == ' ') {
space_counter++;
printf("%d+++ \n", space_counter);
}
else if (space_counter == token_counter) {
if (morse_code[i + 1] == ' ' && morse_code[i + 2] == ' ') {
return true;
}
else {
return false;
}
}
}
}
void decode_morse(const char *morse_code) {
uint16_t input_len = strlen(morse_code);
char *word = strtok(morse_code, " ");
uint16_t token_number = 1;
while (word != NULL) {
for (int voc_word_iter = 0; voc_word_iter < 55; voc_word_iter++) {
if (strcmp(word, morse[voc_word_iter]) == 0) {
if (find_space_positions(input,token_number, input_len )) {
buf[iter] = ' ';
iter++;
}
buf[iter] = *ascii[voc_word_iter];
iter++;
break;
}
}
word = strtok(NULL, " ");
token_number++;
}
printf("%s\n", buf);
}
int main () {
decode_morse(input);
return 777;
}
“.”v
1条答案
按热度按时间llmtgqce1#
“* 但它的工作不完全正确,我不明白为什么。”
很难诊断出乐观的代码以错误的方式做了错误的事情。然而,值得注意的是,辅助函数
find_space_positions()
试图找到曾经是3个连续空格的吸烟剩余物。不幸的是,这个辅助函数在搜索token_num
时将剩余的SP对计数为2,而token_num
仅为1(对于每个单词...)。这一切都错得有点离谱,无法纠正。正如“ 什么是更好的方法来做这样的东西在C?* ”以下是为执行评论中概述的办法而提出的:
请注意,每个函数只做一件事。层次方法遵循KISS原则。
这会输出“HEY JUDE”。
- .- -.- . .- ... .- -.. -.-. --- -.. . .- -. -.. -- .- -.- . .. - -... . - - . .-.
编辑:
作为奖励,这里是您的
morse[]
和ascii[]
数组合并成一个数组。使用这个方法,所需要做的就是在搜索匹配的函数/循环中修改strcmp()
:(不用说,你提供的代码的正确性或完整性没有经过双重检查。买者自负!)