编辑2:我意识到我没有在数据库中没有的任何查询的“未找到”结果。已经进行了更改以引入此功能。这是当前的测试和测试输出:
输入:
3
sam
99912222
tom
11122222
harry
12299933
sam
edward
harry
输出:
Not found
=0
Not found
=0
Not found
=0
Not found
=0
sam
=99912222
Not found
=0
Not found
=0
Not found
[Infinite loop continues]
编辑:我在display()中的while循环中更改了一些内容。我现在得到一个无限循环打印“= 0”,除了通过搜索的第三个或第四个循环。嗯...
顺便说一句,感谢提醒您使用==
测试字符串。现在看起来很简单。
我已经做了一些搜索,但还没有能够理解我的代码出错了。我正在开展一项挑战,这将带来一个简单的电话簿计划。它将输入一个数字(要添加的条目数),然后输入名称和相关的电话号码(无破折号或句号)。添加条目后,用户可以按名称搜索条目,并以“name = number”格式显示数字。
代码在display()函数中抛出while循环的分段错误。我假设我试图打印分配为NULL的东西,但我无法弄清楚我哪里出错了。任何帮助都将非常感激。
最后,挑战要求我在EOF之前阅读查询;然而,这让我感到困惑,因为我接受来自stdin的用户输入。使用stdin看EOF是什么样的,只是寄存器返回(\n
)?
(PS:这是我第一次尝试链接列表,所以任何指针都会非常感激。)
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
void add_entry(void);
void display(void);
struct phonebook {
char name[50];
int number;
struct phonebook *next;
};
struct phonebook *firstp, *currentp, *newp;
char tempname[50];
int main() {
int N;
firstp = NULL;
scanf("%d", &N);
for (int i = 0; i < N; i++) {
add_entry();
}
display();
return 0;
}
void add_entry(void) {
newp = (struct phonebook*)malloc(sizeof(struct phonebook));
if (firstp == NULL) firstp = currentp = newp;
else {
currentp = firstp;
while (currentp->next != NULL)
currentp = currentp->next;
currentp->next = newp;
currentp = newp;
}
fgets(currentp->name, 50, stdin);
scanf("%d", ¤tp->number);
currentp->next = NULL;
}
void display(void) {
while (strcmp(tempname, "\n") != 0) {
currentp = firstp;
fgets(tempname, 50, stdin);
while (strcmp(currentp->name, tempname) != 0) {
if (currentp->next == NULL) {
printf("Not found\n");
break;
}
currentp = currentp->next;
}
printf("%s=%d\n", currentp->name, currentp->number);
}
}
答案 0 :(得分:1)
您的问题是您永远找不到您正在寻找的条目。表达式currentp->name != tempname
将永远为真,因为它们总是不相等的。在C中,此等式测试不会编译为逐个字符的比较,而是编译为指向currentp->name
和tempname
的指针。由于这些地址从不相同,因此永远不会相同。
请尝试!strcmp(currentp->name, tempname)
。
然后,您崩溃的原因是因为您到达列表末尾,以便在循环后currentp
为NULL
,然后您尝试打印NULL->name
和NULL->number
,实际上导致了崩溃。
此外,另一方面,您可能希望开始使用局部变量,而不是使用全局变量。
答案 1 :(得分:0)
不确定这是否解决了问题,但你无法在C中直接比较字符串!=你需要使用if(strcmp(string1,string2)== 0)来检查。
fgets不像getchar那样采用EOF(= -1),但确实包括&#39; \ n&#39;并使用NULL(= 0)填充其余部分,因此检查EOF确实没有用,但是可以在\ n或NULL后停止。