1

(単一の)リンクリストを使用して、単純なC従業員データベースプログラムをコーディングしています。現時点では、以下に示す「従業員の削除」関数を作成しようとしています。

while ループを使用してリンクされたリストを循環させようとしていますが、現在のポインター名フィールドがユーザーが削除したい名前と一致すると停止します。(linestore に格納されます。)

なんらかの理由で、最後までデータベースをループし続けます。各段階で 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

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

が間違っている場合は、使用するstrcmp()か、strncmp()

于 2013-08-08T18:29:15.553 に答える
0

次の 2 つのことがわかります。

1) を使用して文字列を比較したいstrcmp()/strncmp()。を使用==すると、それらがメモリ内の同じ場所に格納されているかどうかがチェックされます。

2) そのループの条件では&&なく、おそらく必要でした。はビット単位の and であり、whileは論理 AND です。&while&&&

于 2013-08-08T18:30:55.367 に答える