将char从字符串传递到函数

时间:2018-12-20 01:06:42

标签: c

我正在尝试将一些文本翻译成摩尔斯字母表。当我发送单个字母使其正常工作时,但是我想使它写一个单词,因此我尝试使用指针索引一个一个地发送单词,但是这种情况不会发生,请帮忙。


树结构:

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);
    }
}

主要:[我手动初始化了莫尔斯电码和字母。]

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 :(得分:1)

我的猜测是问题在于使用strcmp函数比较单个字符(例如strcmp(letter,node->letter))。

此函数(strcmp)比较以空值结尾的C字符串,因此,在您尝试比较字母“ B”的情况下,它实际上将比较字符串“ BA”。

您可以使用==运算符来比较字符,如下所示: if(letter == node->letter)

但是,当然,如果没有完整的代码段,很难说出来。

答案 1 :(得分:-1)

您的数组类型被不必要地混淆了。您应该做的是创建一个表,其中字母另存为索引。

为此,您需要确保系统使用健全的符号表。所有主流系统(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]) ] );
}

这仅支持大写字母,不包含空格,但是您可以理解。