Причина, по которой ваша переменная morse
меняется, заключается в том, что она указывает на область в стеке.Причина, по которой он указывает на область в стеке, заключается в том, что вы присвоили ему адрес вашего параметра english
, который был помещен в стек при вызове вашей функции, а затем вытолкнут из стека после завершения функции.
Теперь ваша переменная Морзе будет указывать на то, какая память занимает одно и то же место в стеке, которое будет постоянно меняться на протяжении всей жизни вашей программы.
На мой взгляд, лучший способ решить эту проблему - это вернутьNULL-указатель из EnglishToMorse
, если символ не является AZ ..., тогда проверьте наличие NULL-указателя в вашей функции isMorse
.В конце концов, хорошей практикой является проверка указателей NULL в коде.
char* EnglishToMorse(char english)
{
int i;
english = toupper(english);
for (i = 0; i < LOOKUP_SIZE; i++)
{
if (lookup[i].character == english)
return lookup[i].morse;
}
return NULL;
}
int isMorse(char* morse)
{
int i;
/* Check for NULL, so strcmp doesn't fail. */
if (morse == NULL) return 0;
for (i = 0; i < LOOKUP_SIZE; i++)
{
if(strcmp(morse, lookup[i].morse) == 0)
return 1;
}
return 0;
}