С вашим кодом так много проблем.
Во-первых, strcat
принимает 2 параметра - пункт назначения, а затем источник. Во всех случаях, когда вы используете его, вы ошибаетесь.
Во-вторых, ваша функция to_morse
возвращает int
, когда вы хотите, чтобы она возвращала char *
. Это было бы, как вы передаете указатели.
В-третьих, вы не выделяете памяти для output
в этой функции, поэтому, даже если вы правильно настроили strcat
, вам некуда было хранить азбуку Морзе. Это также произойдет в случае сбоя кода при передаче неинициализированного указателя на strcat
.
Наконец, вам, вероятно, следует проверить, что символ, который вы пытаетесь преобразовать в азбуку Морзе, является буквой, иначе вы выйдете за пределы своего массива.
Вот как должен выглядеть ваш код. Я также настроил его так, чтобы между каждой буквой Морзе был пробел, иначе вы бы не смогли определить, где один начинается, а другой заканчивается.
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
char *to_morse(char *);
int main(int argc, char **argv)
{
char *temp;
for (int counter = 1; counter < argc; counter++)
{
temp = to_morse(argv[counter]);
printf("%s", temp);
free(temp); // Always remember to free memory you allocate
}
return 0;
}
char *to_morse(char *str)
{
char *morse[27] = {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."};
char *output=malloc((strlen(str)*5)+1); // Always remember to allocate 1 more char than you need to store the NUL terminate when allocating memory for strings.
output[0] = '\0'; // strcat need a null terminator in the string.
char character;
for (int counter = 0; str[counter] != '\0'; counter++)
{
if(isalpha(str[counter]))
{
character = toupper(str[counter]);
strcat(output,morse[character-'A']);
strcat(output," ");
}
}
return output;
}