C - Ошибка сегментации в строке для программы с азбукой Морзе - PullRequest
0 голосов
/ 07 ноября 2018

Я уже несколько часов пытаюсь закодировать действительно простой преобразователь строки в азбуку Морзе и, наконец, получил его для компиляции без каких-либо предупреждений. Я новичок в C, поэтому я действительно не могу понять, как исправить мой код. Я считаю, что проблема должна заключаться в том, как я передаю строки с помощью указателей и т. Д., Так как это та часть, которую я не понимаю больше всего. Я нашел пример того, как это сделать, но я все еще не мог этого понять, и не было никакого конкретного случая, который был бы похож на мой, так как я хочу, чтобы он считывал строки из аргументов (все аргументы являются строками / слова).

А теперь при попытке запуска возникает ошибка сегментации:

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

int to_morse(char *);

int main(int argc, char **argv)
{
    char morse[80];
    char *temp;
    for (int counter = 1; counter < argc; counter++)
    {
        *temp = to_morse(argv[counter]);
        strcat(temp, morse);
        printf("%s", morse);
    }

    return 0;
}

int to_morse(char *str)
{
    char *morse[27] =  {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."};
    char *output;
    char character;

    for (int counter = 0; str[counter] != '\0'; counter++)
    {
        character = toupper(str[counter]);
        strcat(morse[character-'A'], output);
    }

    return *output;
}

Я считаю, что это неправильный способ передачи строк с помощью указателей, но я не могу найти правильный путь. Как я смогу заставить мой код работать?

Примечание: я знаю, что где-то может быть дубликат ... однако есть тонны вопросов об ошибках сегментации, и все они действительно специфичны и не охватывают мой сценарий, поэтому я не смог найти один.

1 Ответ

0 голосов
/ 07 ноября 2018

С вашим кодом так много проблем.

Во-первых, 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...