我正在尝试将一些文本翻译成摩尔斯字母表。当我发送单个字母使其正常工作时,但是我想使它写一个单词,因此我尝试使用指针索引一个一个地发送单词,但是这种情况不会发生,请帮忙。
树结构:
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");
}
答案 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]) ] );
}
这仅支持大写字母,不包含空格,但是您可以理解。