我正试图立即绕过C(主要是指针如何操作)。我正在尝试编写下面描述的这个函数:
/ * EnterName在符号表中输入名称。返回一个 boolean指示Name的条目是否为 已列在表中。传回一个论点 包含名称的条目引用。
无论如何,这是我写的代码,我不知道如何测试它。想知道是否有人可以查看它并让我知道我是否正确行事。
提前致谢。
代码::
bool EnterName(struct SymTab *ATable,
const char *Name,
struct SymEntry * *AnEntry)
{
char name = *Name;
unsigned hashval = hash (&name);
struct SymEntry *ptr;
ptr = ATable->Contents[hashval];
while(ptr != NULL)
{
if(strcmp(ptr->Name, &name))
{
AnEntry = &ptr;
return true;
}
}
ptr = malloc(sizeof(struct SymEntry));
ptr->Name = &name;
AnEntry = &ptr;
return false;
}
答案 0 :(得分:3)
它是否会运行并产生您期望的结果?
在学习新语言时,无法替代编译代码,使用测试数据运行代码,将结果与预期值进行比较,调试等。向他人展示未经测试的代码并询问是否正确是不正确的方法。
即使是函数的前两行也没有意义:
char name = *Name;
unsigned hashval = hash(&name);
您刚刚将Name
的第一个字符带入name
变量,然后尝试哈希其地址。
现在,循环:
while(ptr != NULL)
{
if(strcmp(ptr->Name, &name))
{
AnEntry = &ptr;
return true;
}
}
也没有意义,因为你没有在任何地方推进ptr
- 这是一个无限循环。
也就是说,代码中似乎朝着正确的方向迈出了一步。你必须让你的类型笔直,并修复所有粗糙的角落。我建议从小块开始 - 看它们编译并运行,然后继续组装成更大的块。
答案 1 :(得分:0)
我至少可以发现一个错误。你只是哈希每个名字的第一个字母......
name =单个chatacter(副本)
hash(& name),散列单个字符的副本。
你想要一个带有大写的散列(Name),这样你就可以给sting开始哈希,所以它可以散列整个东西。
答案 2 :(得分:0)
char name = *Name;
这将使用Name
的第一个字符并将其存储在name
中(字符串Hello
将被截断为单个H
)。您当然希望name
是char*
(指向字符数组的指针)而不是单个字符。
strcmp(a,b)
返回0。我认为应该是
if(!strcmp(ptr->Name, name))
此外,您的循环可能会永远运行。如果第一次比较失败(假设您添加!),循环将永远继续,因为ptr
的值永远不会改变。
你的代码有很多错误。你必须测试它。拿一个编译器,编译它,运行它。没有测试的编程是不可能的。
答案 3 :(得分:0)
此
AnEntry = &ptr;
没有做你想做的事。它正在更改 local 变量AnEntry的值而不更改调用例程中的值。
你想要
*AnEntry = ptr;
还有其他一些错误,也可能是错误,但是其他人似乎已经很好地覆盖了这些错误......