【问题标题】:adding a new user to list in c program在 c 程序中添加新用户到列表
【发布时间】:2014-03-25 06:50:34
【问题描述】:

我只是想写一个简单的函数来将朋友添加到 UserAccount 列表中。所有信息都通过参数提供。如果用户已经在列表中,我不需要再次添加他,而是显示记录说他已经在列表中。我写了这段代码。不确定这是否正确,有什么改进代码的建议吗?这行得通吗?

int add_friend(UserAccount* user, char Circle, UserAccount* friend)
{
    struct UserAccountNode *p;

    p = (struct UserAccountNode *) malloc(sizeof(struct UserAccountNode));

    while (p != NULL)
        if(stricmp(user, p->friend) == 0){

            p->next = head; // inserting at the beginning
            head = p;
        }
        else {

            printf("%d already exists", friend)
        };
}

【问题讨论】:

  • 在其他部分添加break;
  • if 可能缺少{}
  • 你试过了吗?实际上缺少一半所需的代码。
  • @MichaelWalz 我没有,因为我没有编写整个程序来使上面的代码工作。我只是应该按照我认为应该的方式编写上面的代码。这就是为什么我不知道它是否正确
  • @user3315144:如果您的代码完全错误。 1) 您使用p= malloc.... 为一个用户分配空间,然后将该指针用作指向应该包含用户列表的列表的指针。 2)你做strcmpi(user, p->friend),这是错误的,因为user不指向一个字符串。 3) 你不使用circle 参数。 4) 你在没有提供所有需要的信息的情况下提出问题,UserAccount 是什么?

标签: c linked-list nodes string-comparison


【解决方案1】:

“不确定这是否正确” - 它是否按照您的意图执行?如果是这样,它可能是正确的;如果不。嗯……

不,它在任何地方接近都是正确的。错误的清单为废弃全部提供了一个不错的理由。此类事情包括(但不限于):

  • 您声称要有条件地添加新朋友,但前提是他们尚未在列表中。然而,您要做的第一件事是为您甚至不确定是否需要的东西分配空间?

  • 您的循环没有可能满足的退出条件(除非malloc() 实际上失败)。从来没有p,唯一的退出条件参数,ever 在函数的第一行之后分配给 anything,它为它分配了一个动态分配,你甚至可能没有需要。 IE。你有一个无限循环。

  • 您将UserAccount* 作为第一个参数传递给stricmp,它需要const char*

  • 您将p->frienduser 进行比较。但是您刚刚分配了p 指向的内容。它的friend 成员是不确定的,即没有定义的内容,但是您将那个未定义的内容发送到stricmp() 以与输入参数进行比较user。这会调用未定义的行为

  • 比较逻辑是向后的。 stricmp() 如果字符串不区分大小写等于,则返回 0;没有什么不同。你的逻辑(即使你没有因为上面提到的前面的项目而调用未定义的行为)至少尝试仅当它们已经存在时才将它们添加到列表中。

  • 在列表中的两次迭代之后,如果奇迹般地 if 表达式两次评估为 true,则您创建了一个循环自引用节点并将您最初拥有的任何列表孤立到深渊中。

  • 您将 friendUserAccount* 发送到带有 "%d" 格式说明符的 printf。虽然这可能不会崩溃您的程序,但它仍然是更多未定义的行为。如果您想使用printf() 打印指针值,请使用"%p"

  • 老实说,未使用的函数参数是您最不担心的。它们可能没有被使用过,但从好的方面来说,它们同样没有被错误地使用userfriend 不能说的话。

我不会向你炫耀“努力”或“不错的尝试”。这段代码即使编译也不可能,而且绝对有可能永远正确运行。您需要查看您尝试实现的实际算法,并大量查看 C 中指针和动态内存的使用情况。

【讨论】:

    【解决方案2】:

    你的代码至少有两个问题:

    1. while (p != NULL)

      如果p不是NULL,这将是一个无限循环,因为你没有改变循环体中的p或者使用break这样的语句跳出来。

    2. stricmp(user, p->friend)

      你正在使用一个未初始化的变量,这个

      p = (struct UserAccountNode *) malloc(sizeof(struct UserAccountNode));
      

      只分配了一个结构,但在 while 循环中使用它之前从未初始化它。

    可能还有其他错误,例如您从未使用过friend 参数,stricmp() 的参数可能是错误的,等等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-30
      • 2013-11-20
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      • 2014-01-09
      • 1970-01-01
      相关资源
      最近更新 更多