c - Something wrong with strcmp?



我的分配是将文件读取到链接列表中。该文件包含一个名称和一个字母,指示如何使用该名称,从列表中添加或删除。该文件以这种格式:

Kathy A

贝弗利A

Chuck A

Radell A

gary 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 %sn", 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("%sn", tempname);
        printf("%sn", 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);
}

我在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

使用您的代码,添加似乎可以正常工作,并且通过我的更改,删除看起来还不错。

相关内容

  • 没有找到相关文章

最新更新