【问题标题】:add or delete data from structure从结构中添加或删除数据
【发布时间】:2013-01-07 14:48:40
【问题描述】:

我有以下代码: (我只保留了我的问题的相关部分)

        // Structure
        struct first_list {
            char firstname[100];
            struct first_list * next;
        };
        struct last_list {
            char lastname[100];
            struct last_list * next;
        };

        void verify_name()
        {
            char firstname[100];
            char lastname[100];
            struct first_list * curr_first = loaded_first;
            struct last_list * curr_last = loaded_last;

        /////////// this part was added by me
            while( curr_last != NULL )
            {
                strncpy(lastname, curr_last->lastname, sizeof( lastname ) - 1 );
                valid = validate_name(sock,buffer,sizeof(buffer),firstname);
                if(valid < 1)
                    fprintf(stderr, "%s is VALID\n", lastname);
                else
                    fprintf(stderr, "%s is invalid\n", lastname);

                curr_last = curr_last->next; //this is used for removing current record

            }
            printf( "LastName validation complete\n" );
            break;
        /////////// end of part added by me

            while( curr_last != NULL && curr_first != NULL )
            {
                strncpy(firstname, curr_first->firstname, sizeof( firstname ) - 1 );
                strncpy(lastname, curr_last->lastname, sizeof( lastname ) - 1 );

                ////////////////////////////////
                //// irrelevant code (functions)
                ////////////////////////////////

                if( curr_first->next == NULL && curr_last->next != NULL)
                {
                    curr_last = curr_last->next;
                    curr_first = loaded_first;
                }
                else 
                    curr_first = curr_first->next;
            }
        }

所以,我在同时验证名字和姓氏的函数之前添加了一个新函数来验证姓氏(以优化整个过程)。问题是,如果我删除 break 命令,我会收到一个错误,因为验证后 last_list 为空。

我怎样才能在结构中只保留有效的姓氏,因为现在当移动到下一条记录时,它正在删除当前记录,直到循环完成(NULL)??

【问题讨论】:

  • 警告:strncpy 不安全。使用后需要空终止,因为它本身不会这样做。
  • 我只发布了有关结构的问题的相关代码。
  • 您仍然应该听取一位绅士的建议,这就是他将其作为评论发布的原因,因为它与您的问题无关

标签: c struct structure


【解决方案1】:

您在第一个循环中需要做的是:

struct last_list * prev = NULL;
struct last_list * next = NULL;
while (curr_last != NULL)
{
  next = curr_last->next;
  strncpy(lastname, curr_last->lastname, sizeof(lastname) - 1);
  lastname[sizeof(lastname) - 1] = 0;
  valid = validate_name(sock,buffer,sizeof(buffer),firstname);
  if(valid < 1)
  {
    fprintf(stderr, "%s is VALID\n", lastname);
    prev = curr_last;
  }
  else
  {
    fprintf(stderr, "%s is invalid\n", lastname);
    if (prev == NULL)
      loaded_last = curr_last->next;  //this is used for removing when current is first record
    else
      prev->next = curr_last->next; //this is used for removing current record from mid-list
    free(curr_last); //Freeing should be needed but depends on how you built your list.
  }
  curr_last = next;
}
curr_last = loaded_last;

这将从列表中删除您的 curr_last 元素并仅保留其中的有效姓氏。

【讨论】:

  • 谢谢,我测试了它,但它只保存验证后最后一个好的姓氏。它不会保存所有这些。
  • 抱歉,我认为您只需要保存验证的,因为您的问题是“我怎样才能在结构中只保留有效的姓氏?”
【解决方案2】:

您已经在循环中“使用”了(例如)cur_last->next 列表,因此您需要重新初始化 cur_first 和 cur_last 以指向列表的开头,或者有一个执行这两个功能的循环

【讨论】:

  • 不能有一个循环来执行这两个功能。我必须使用 2 个循环
猜你喜欢
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多