1

我正在通过使用(单个)链表编写一个简单的 C 员工数据库程序。目前我正在尝试编写“删除员工”功能,如下所示。

我正在尝试使用 while 循环遍历链表,并在当前指针名称字段与用户希望删除的名称匹配时停止。(存储在行库中。)

出于某种原因,无论如何,它都会一直循环遍历数据库直到结束。我尝试在每个阶段打印 linestore & currptr->name 的内容,它们看起来是正确的,所以我不知道我做错了什么。

任何帮助将不胜感激。

删除员工功能:

char *lineptr;
char linestore[300];
lineptr = &linestore;

struct Employee *currptr = root;
struct Employee *prevptr = NULL;

fprintf(stderr, "\nPlease enter the EXACT name of the employee to be deleted.\n");
read_line(stdin, lineptr, MAX_NAME_LENGTH);  //linestore function is working (checked)



while ( (currptr->name != linestore) & (currptr != NULL) )
{
  fprintf(stderr, "\n***Searching database...***\n");
  fprintf(stderr, "***The current record is %s", currptr->name);
  prevptr = currptr;
  currptr = currptr->next;
}

if ( currptr->name == linestore )
{

  fprintf(stderr, "\n***Record DELETED.***\n");
}
4

6 回答 6

3
currptr->name == linestore

==不比较值。相反,它比较指针。对于字符串比较,您需要改用strncmp函数。

于 2013-08-08T18:28:43.690 回答
1

你应该使用strncmp

比较具有特定长度的名称

if (strncmp (currptr->name, linestore, strLength) == 0 && (currptr != NULL) )
{
}

在比较布尔条件时 & 也应该是 &&

于 2013-08-08T18:29:50.070 回答
1

使用strcmp并且通常您应该使用逻辑&&而不是按位&来执行您正在做的事情。
==!=比较您的指针,而不是指针后面的内容(字符)。

此外,下次您应该提供完整的代码示例。在这里,您的链表的实现丢失了..也许您还有另一个错误?

于 2013-08-08T18:34:45.730 回答
0

程序中有两个错误。

第一个是使用

    strcmp(currptr->name,linestore)

下一个是您使用按位运算符 '&' 而不是逻辑和 '&&' 运算符。

   while (strcmp(currptr->name, linestore) && (currptr != NULL))
于 2013-08-08T18:51:13.800 回答
0

currptr->name != linestorecurrptr->name == linestore

不正确,您必须使用strcmp()strncmp()

于 2013-08-08T18:29:15.553 回答
0

我看到两件事:

1)您想使用比较字符串strcmp()/strncmp()。Using==将检查它们是否存储在内存中的相同位置。

2)您可能想要&&而不是&while循环的条件。&是按位与,&&而是逻辑与。

于 2013-08-08T18:30:55.367 回答