モールス符号を文字に変換しようとする次のコードがあります。
#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 を含む配列になると思いました。なぜこれが失敗するのですか?
ありがとう