2使用strcmp函数测试失败

时间:2013-07-03 23:04:06

标签: c++ strcmp

以下代码位于我的标题文件中:

int mystrcmp(const char *s1, const char *s2) // strcmp function
{
    while(*s1 == *s2)
    {
        if(*s1 == '\0' || *s2 == '\0')
            break;

        s1++;
        s2++;
    }

    if(*s1 == '\0' && *s2 == '\0')
        return (0);
    else
        return (-1);
}

问题是当我运行它时我的main.cpp表示它未通过2次测试

以下是我的main.cpp的摘录:

void testmystrcmp(void)
{
   int iResult;

   iResult = mystrcmp("Ruth", "Ruth");
   ASSURE(iResult == 0);

   iResult = mystrcmp("Gehrig", "Ruth");
   ASSURE(iResult < 0);

   iResult = mystrcmp("Ruth", "Gehrig");
   ASSURE(iResult > 0);  // right here mystrcmp fails the test

   iResult = mystrcmp("", "Ruth");
   ASSURE(iResult < 0);

   iResult = mystrcmp("Ruth", "");
   ASSURE(iResult > 0);

   iResult = mystrcmp("", "");
   ASSURE(iResult == 0); // it also fails the test here but why??
}

注意:我无法更改.cpp文件

我一直试图解决这个问题,但不知道如何。

5 个答案:

答案 0 :(得分:5)

strcmp被定义为如果“first”字符串大于“second”字符串则返回正值,如果它们相等则返回零值,如果“first”小于,则返回负值“第二”字符串。因此,如果字符串不相等,您应该决定哪一个更大,然后返回适当的值。

实现这一目标的一种简单方法是返回*s1 - *s2(当它们相等时也返回0,作为奖励)。

答案 1 :(得分:2)

好吧,在您的mystrcmp函数中,我看不到您返回正数的位置,因此"Ruth""Gehrig之间的比较将始终失败。

答案 2 :(得分:0)

您只需返回-10。阅读断言,他们为什么失败?

另外,在第5行,您只需要检查 *s1=='\0' *s2=='\0',因为您知道它们是相同的while条件。

答案 3 :(得分:0)

正如其他人所说,strcmp应该返回正数和负数。

请改为尝试:

int mystrcmp(const char *s1, const char *s2){
    for(;*s1 && *s2 && (*s1 == *s2); s1++, s2++){}
    return *s1 - *s2;
}

答案 4 :(得分:0)

嗯......你的mystrcmp函数不会在第二次测试中失败。

http://ideone.com/ZcW02n

#include <iostream>

int mystrcmp(const char *s1, const char *s2) // strcmp function
{
    while(*s1 == *s2)
    {
        if(*s1 == '\0' || *s2 == '\0')
            break;

        s1++;
        s2++;
    }

    if(*s1 == '\0' && *s2 == '\0')
        return (0);
    else
        return (-1);
}

int main() {
        std::cout << mystrcmp("","") << std::endl;
        return 0;
}

 output: 0