C - 显示期间的链接列表分段错误

时间:2016-01-27 03:30:43

标签: c linked-list segmentation-fault

编辑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", &currentp->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);
    }
}

2 个答案:

答案 0 :(得分:1)

您的问题是您永远找不到您正在寻找的条目。表达式currentp->name != tempname将永远为真,因为它们总是不相等的。在C中,此等式测试不会编译为逐个字符的比较,而是编译为指向currentp->nametempname的指针。由于这些地址从不相同,因此永远不会相同。

请尝试!strcmp(currentp->name, tempname)

然后,您崩溃的原因是因为您到达列表末尾,以便在循环后currentpNULL,然后您尝试打印NULL->nameNULL->number,实际上导致了崩溃。

此外,另一方面,您可能希望开始使用局部变量,而不是使用全局变量。

答案 1 :(得分:0)

不确定这是否解决了问题,但你无法在C中直接比较字符串!=你需要使用if(strcmp(string1,string2)== 0)来检查。

fgets不像getchar那样采用EOF(= -1),但确实包括&#39; \ n&#39;并使用NULL(= 0)填充其余部分,因此检查EOF确实没有用,但是可以在\ n或NULL后停止。