1

モールス符号を文字に変換しようとする次のコードがあります。

#include <stdio.h>
#include <string.h>

#define BSIZE 15

char *morseToLetter(char *);


int main() {
    char *morseCode = ".... . .-.. .-.. --- / -.. .- .. .-.. -.-- / .--. .-. --- --. .-. .- -- -- . .-. / --. --- --- -.. / .-.. ..- -.-. -.- / --- -. / - .... . / -.-. .... .- .-.. .-.. . -. --. . ... / - --- -.. .- -.--";    
    char buffer[BSIZE] = { 0 };
    int bufferKey = 0;

    for(int i=0,t = strlen(morseCode)+1;i<t;i++) {
        if (morseCode[i] == '/') {
            printf(" ");
        }
        else {
            if (morseCode[i] == ' ') {
                if (strlen(buffer) == 0) {
                    continue;
                }

                printf("%s",morseToLetter(buffer));

                memset(buffer,0,BSIZE);
                bufferKey = 0;
            }
            else {
                buffer[bufferKey++] = morseCode[i];
            }            
        }        
    }

    if (strlen(buffer) > 0) {      
        printf("%s",morseToLetter(buffer));                
    }

    printf("\n");

    return 0;
}

char *morseToLetter(char *morseLetter) {
    static char morse[][BSIZE] = {
        "·–","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"
    };
    static int morseTotal = sizeof(morse)/sizeof(morse[0]);

    for (int i = 0;i<morseTotal;i +=2) {        
        if (strcmp(morseLetter,morse[i]) == 0) {
            return morse[i+1];
        }
    }

    return '\0';
}

私が抱えている問題は strcmp(morseLetter,morse[i]) にあります

gdb を実行すると、次のようになります。

if (strcmp(morseLetter,morse[i]) == 0) {

(gdb) モールス文字を表示

1: モールスレター = 0x7fffffffe4d0 "...."

(gdb) モールス表示[i]

2: morse[i] = "·–\000\000\000\000\000\000\000\000\000"

したがって、モールス符号の正しい文字列に到達すると、「...\000\000\000\000\000\000」と表示され、比較に失敗します。ここでは論理に従っていません。C の文字列は \0 を含む配列になると思いました。なぜこれが失敗するのですか?

ありがとう

4

1 に答える 1

8

中央のドットを使用して文字コードを定義しました·が、デコードするテキストは通常​​のドットを使用します.

これらのstrcmp文字は異なる文字であるため、関数はこれらの文字を異なるものと見なします。

于 2013-09-17T22:29:40.990 に答える