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
相关产品推荐
相关产品推荐

