You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Codewars Grasshopper个性化问候函数C语言实现报错求助

C语言个性化问候函数问题排查

问题情况

刚开始在Codewars学习C语言,完成「个性化问候函数」题目时提交代码后测试用例报错,不清楚问题所在,寻求指导。

报错信息

  • 表达式greet(danielToo, "Daniel") == "Hello boss"不成立:实际输出为Hello guest,预期为Hello boss
  • 表达式strcmp(greet(second, secondCopy), greetChecker(second, second)) == 0不成立

题目要求

创建一个生成个性化问候的函数,接收两个参数name和owner:

  • 当name等于owner时,返回'Hello boss'
  • 否则返回'Hello guest'

我的代码

const char* greet(const char *name, const char *owner) {
  if (name == owner)
    {
      return "Hello boss";
    }
    else
    {
      return "Hello guest";
    }
  return "";
}

测试用例

#include <criterion/criterion.h>

const char* greet(const char *name, const char *owner);

Test(ExampleTests, ShouldPassAllTheTestsProvided) {
    cr_assert_str_eq(greet("Daniel", "Daniel"), "Hello boss");
    cr_assert_str_eq(greet("Greg", "Daniel"), "Hello guest");
    static const char danielToo[] = "Daniel";
    cr_assert_str_eq(greet(danielToo, "Daniel"), "Hello boss");
    cr_assert_str_eq(greet("Cat", "Catherine"), "Hello guest", "Cat is not Catherine");
    cr_assert_str_eq(greet("Catherine", "Cat"), "Hello guest", "Caterine is not Cat");
}

问题原因与解决方法

问题出在字符串的比较方式上:C语言中,const char*类型的变量存储的是字符串的内存地址,用==比较的是两个指针的地址是否相同,而不是字符串的内容是否一致。

比如测试用例里的danielToo是数组,存储在栈上;"Daniel"是字符串常量,存储在只读数据段,两者内存地址不同,所以name == owner判断为假,返回了错误结果。

正确做法是使用<string.h>头文件中的strcmp函数比较字符串内容:

  • strcmp(a, b)返回0时,表示两个字符串内容完全相同
  • 返回非0值时,表示内容不同

修改后的代码如下:

#include <string.h>

const char* greet(const char *name, const char *owner) {
    return strcmp(name, owner) == 0 ? "Hello boss" : "Hello guest";
}

这样就能正确比较字符串内容,通过所有测试用例。

内容的提问来源于stack exchange,提问作者vincentvii6

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 14:25:29