C语言 在莫尔斯码译码中发现3个空格

cbwuti44  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(86)

我只是为了学习而解决简单的问题。任务:用莫尔斯码对给定的字符串进行编码,返回编码后的字符串。问题:在莫尔斯码中,当字符串被拆分为标记时,表示单词之间有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

llmtgqce

llmtgqce1#

“* 但它的工作不完全正确,我不明白为什么。
很难诊断出乐观的代码以错误的方式做了错误的事情。然而,值得注意的是,辅助函数find_space_positions()试图找到曾经是3个连续空格的吸烟剩余物。不幸的是,这个辅助函数在搜索token_num时将剩余的SP对计数为2,而token_num仅为1(对于每个单词...)。这一切都错得有点离谱,无法纠正。
正如“
什么是更好的方法来做这样的东西在C?* ”以下是为执行评论中概述的办法而提出的:

// Your #includes and arrays of morse[] & ascii not repeated here

char decode_morse_char( char *cp ) {
    // Find a match in the array of Morse strings
    // Return the single ASCII character (or '#' for not found)
    for( int i = 0; i < sizeof morse / sizeof morse[0]; i++ )
        if( strcmp( cp, morse[i] ) == 0 )
            return ascii[i][0];
    return '#'; // not in alphabet, 
}

void decode_morse_word( char *cp ) {
    // break the "word" into individual Morse strings for lookup
    for( char *ltr = cp; (ltr = strtok( ltr, " " ) ) != NULL; ltr = NULL )
        putchar( decode_morse_char( ltr ) ); // decode one Morse character code
}

void decode_morse_text( char *cp ) {
    char *wordSep = "   "; // break into "words" on 3 SP's together
    char *ep;
    while( ( ep = strstr( cp, wordSep ) ) != NULL ) {
        *ep = '\0'; // "tokenise" the word in the buffer
        decode_morse_word( cp ); // decode one "word"
        putchar( ' ' ); // and output a separating SP
        cp = ep + 1;
    }
    decode_morse_word( cp ); // the final "word"
    putchar( '\n' );
}

int main( void ) {
    char input[] = ".... . -.--   .--- ..- -.. .";

    decode_morse_text( input ); // entire string

    return 0;
}

请注意,每个函数只做一件事。层次方法遵循KISS原则。
这会输出“HEY JUDE”。
- .- -.- . .- ... .- -.. -.-. --- -.. . .- -. -.. -- .- -.- . .. - -... . - - . .-.

编辑:

作为奖励,这里是您的morse[]ascii[]数组合并成一个数组。使用这个方法,所需要做的就是在搜索匹配的函数/循环中修改strcmp()

char *morse[] = {
    "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----.",
    "..-.-.-",  ",--..--",  "?..--..",  "'.----.",  "!-.-.--",
    "/-..-.",   "(-.--.",   ")-.--.-",  "&.-...",   ":---...",
    ";-.-.-.",  "=-...-",   "+.-.-.",   "--....-",  "_..--.-",
    "\\.-..-.",  "$...-..-", "@.--.-.",
};

if( strcmp( cp, morse[i] + 1) == 0 ) // +1 to ignore single prefix character
    return morse[i][0]; // return that prefix character

(不用说,你提供的代码的正确性或完整性没有经过双重检查。买者自负!)

相关问题