0

下面的代码在我的头文件中:

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 文件

我一直在尝试解决此问题,但不知道如何解决。

4

5 回答 5

5

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

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

于 2013-07-03T23:08:22.720 回答
2

好吧,在你的mystrcmp函数中,我看不到你返回正数的地方,所以"Ruth""Gehrig" 之间的比较总是会失败。

于 2013-07-03T23:07:27.377 回答
0

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

试试这个:

int mystrcmp(const char *s1, const char *s2){
    for(;*s1 && *s2 && (*s1 == *s2); s1++, s2++){}
    return *s1 - *s2;
}
于 2013-07-03T23:45:08.910 回答
0

你只会返回-10。阅读断言,为什么它们会失败?

此外,在第 5 行,您只需要检查or 因为您知道它们由于条件而相等。*s1=='\0' *s2=='\0'while

于 2013-07-03T23:07:13.790 回答
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
于 2013-07-04T01:06:21.020 回答