Передать символ из строки в функцию - PullRequest
0 голосов
/ 20 декабря 2018

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


древовидная структура:

typedef struct tree
{
    char *letter;
    char *morscode;
    struct tree *left;
    struct tree *right;
} tree;

Функции:

tree *root=NULL;

void add (char* letter, char* morscode) {
    if (root == NULL) {
        root = (tree *)malloc(sizeof(tree));
        root->letter   = letter;
        root->morscode = morscode;
        root->left     = NULL;
        root->right    = NULL;
    }
    else
    {
        tree *new = (tree *)malloc(sizeof(tree));
        new->letter   = letter;
        new->morscode = morscode;
        new->left     = NULL;
        new->right    = NULL;

        tree *node = root, 
             *mom;
        while (node != NULL) {
            mom = node;
            if (strcmp(letter, dugum->letter) == -1)
                node = node->left;
            else 
                node = node->right;
        }
        if (strcmp(letter, mom->letter) == -1) 
            mom->right = new;
        else 
            mom->right = new; 
    }
}

tree *searchbyletter(char& letter, agac *node) {

    if(strcmp(letter,node->letter) == -1)
        searchbyletter(letter, node->left);
    else if(strcmp(letter, node->letter) == 1)
        searchbyletter(letter, node->right);
    else
        return node;
}

void write(char *letter) {
    int x = strlen(letter),
        i;
    for(i = 0; i < x; i++) {
        printf("%s", searchbyletter(letter[i], root)->morscode);    
    }
}

void preorder(tree *node) {
    if (node != NULL) {
        printf(" %s ", node->letter);
        preorder(node->left);
        preorder(node->right);
    }
}

void inorder(tree *node) {
    if (node != NULL) {
        inorder(node->left);
        printf(" %s ", node->letter);
        inorder(node->right);
    }
}

void postorder(tree *node) {
    if (node!=NULL) {
        postorder(node->left);
        postorder(node->right);
        printf(" %s ", node->letter);
    }
}

main: [Я инициализировал азбуку Морзе и буквы вручную.]

void main() {
    char* arr[27][2] = {
        {" ", " "}, {"E", "."}, 
        {"T", "-"}, {"I", ".."}, 
        {"A", ".-"}, {"N", "-."},
        {"M", "--"}, {"S", "..."}, 
        {"U", "..-"}, {"R", ".-."}, 
        {"W", ".--"}, {"D", "-.."},
        {"K", "-.-"}, {"G", "--."}, 
        {"O", "---"}, {"H", "...."}, 
        {"V", "...-"}, {"F", "..-."},
        {"L", ".-.."}, {"P", ".--."}, 
        {"J", ".---"}, {"B", "-..."}, 
        {"X", "-..-"}, {"C", "-.-."},
        {"Y", "-.--"}, {"Z", "--.."}, 
        {"Q", "--.-"}
    };
    int i, j;
    for(i = 0; i < 27; i++) {
        add(arr[i][0], arr[i][1]);  
    }
    preorder(kok);
    printf("\n");
    inorder(kok);
    printf("\n");
    postorder(kok);
    printf("\n");
    write("HELLO WORLD");
}

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

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

Чтобы это было возможно, вам необходимо убедиться, что ваша система использует таблицу нормальных символов.Это относится ко всем основным системам (ASCII, UTF8 и т. Д.).Если вы беспокоитесь об устаревшей хрени, такой как EBCDIC, вы можете добавить это к коду: _Static_assert('Z'-'A' == 25, "Dysfunctional symbol tables not supported");

Как только будет установлено, что 'A' - 'Z' смежны, вы можете просто сделать это:

#define TABLE_SIZE ('Z'-'A' + 1)
#define INDEX(ch) (ch-'A')        // convert from ASCII to a number 0 to 25

const char* MORSE [TABLE_SIZE] =
{
  [INDEX('A')] = ".-",
  [INDEX('B')] = "-...",
  ...
};

Выше указано то же, что и написание const char* MORSE [TABLE_SIZE] = { ".-", ... }, но обозначенные инициализаторы связывают каждую букву с азбукой Морзе.INDEX('A') оценивается как 0, так как мы хотим, чтобы первая строка указывала из индекса ноль в массиве.

Затем расшифровываем так:

const char str[] = "HELLO";
for(size_t i=0; i<strlen(str); i++)
{
  printf("%s\t", MORSE[ INDEX(str[i]) ] );
}

Это поддерживает только заглавные буквы ипробелов нет, но вы поняли.

0 голосов
/ 20 декабря 2018

Я предполагаю, что проблема заключается в использовании функции strcmp для сравнения отдельных символов (например, strcmp(letter,node->letter)).

Эта функция (strcmp) сравнивает строки C с нулевым символом в конце, поэтомув вашем случае, когда вы пытаетесь сравнить букву «B», она фактически сравнивает строку «BA».

Вы можете сравнить символы с оператором == следующим образом: if(letter == node->letter)

Но изКонечно, без полного фрагмента кода трудно сказать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...