strcmp出了什么问题?

时间:2018-04-05 02:27:09

标签: c file linked-list strtok

我的任务是将文件读入链表。该文件包含一个名称和一个字母,指示如何处理名称,从列表中添加或删除。该文件采用以下格式:

Kathy a

Beverly a

查克

Radell a

加里

Roger d

依旧......

当我尝试拆分名称和操作时出现问题。 strcmp()甚至无法识别代码中的op_code变量。我打印出了名称和op_code,它们打印正确,除非我在op_code附近放置一个字符。

这是我的代码:

//Tristan Shepherd

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct node
{
    char name[42];
    struct node *next;
};

void printList(struct node *head)
{
    struct node *current = head;

    while (current)
    {
        printf("3 %s\n", current->name);
        current = current->next;
    }
}

void addFront(struct node **head, char *newname)
{
    struct node* newnode = (struct node*)malloc(sizeof(struct node));

    strcpy(newnode->name, newname);

    newnode->next = (*head);

    (*head) = newnode;
}

void delete(struct node **head, char *namedelete)
{ 
    struct node* temp = *head, *prev;

    if (temp != NULL && temp->name == namedelete)
    {
        *head = temp->next;
        free(temp);
        return;
    }

    while (temp != NULL && temp->name != namedelete)
    {
        prev = temp;
        temp = temp->next;
    }

    if (temp == NULL) return;

    prev->next = temp->next;

    free(temp);
}

void readfile(struct node *head)
{
    FILE *file = fopen("hw8.data", "r");

    char tname[42];
    char *tempname = (char*)malloc(42*sizeof(char));
    char *op_code = (char*)malloc(1*sizeof(char));

    while(fgets(tname, sizeof(tname), file))
    {  
        tempname = strtok(tname, " ");
        op_code = strtok(NULL, "\n");

        printf("%s\n", tempname);
        printf("%s\n", op_code);

        if (!strcmp(op_code, "a"))
        {
            addFront(&head, tempname);
        }
        else if (!strcmp(op_code, "d"))
        {
            delete(&head, tempname);
        }
    }
    fclose(file);
    printList(head);
}

int main()
{
    struct node *head = NULL;

    readfile(head);

    exit(0);
}

1 个答案:

答案 0 :(得分:0)

我在readFile()中看到的唯一问题是内存泄漏。

char *tempname = (char*)malloc(42*sizeof(char));
char *op_code = (char*)malloc(1*sizeof(char));

应该只是

char *tempname;
char *op_code;

strtok()将字符串分解,它不会产生字符串的副本,因此不需要分配额外的内存。

我确实在delete()中看到了一些问题

您应该使用strcmp()而不是==,就像在readfile()

中一样
if (temp != NULL && temp->name == namedelete)

while (temp != NULL && temp->name != namedelete)

您可能还需要初始化prev

使用您的代码,添加似乎工作正常,并且通过我的更改,删除看起来没问题。