Strncmp实现

时间:2015-09-14 08:19:07

标签: c string compare

我有一个带有测试驱动程序的strncmp函数的以下实现,但是它不会编译。

我也不确定逻辑是否正确。以下是我的编译器的错误消息:

  

警告:控制可能会达到无效功能的结束         [-Wreturn型]

#include <stdio.h>
#include <string.h>

#undef strncmp

int strncmp(const char *s, const char *t, size_t num)
{
    for ( ; num >0;  s++, t++, num--)
        if (*s == 0)
            return 0;

    if (*s == *t) {
        ++s;
        ++t;
    }
    else if (*s != *t)
        return *s - *t;  
}

 int main ()
 {
   char str[][5] = { "R2D2" , "C3PO" , "R2A6" };
   int n;
   puts ("Looking for R2 astromech droids...");
   for (n=0 ; n<3 ; n++)
     if (strncmp (str[n],"R2xx",2) == 0)
     {
       printf ("found %s\n",str[n]);
     }
   return 0;
 }

4 个答案:

答案 0 :(得分:4)

除了其他人提到的错误,you are supposed to compare the characters as unsigned char。一旦你超越ASCII-7,这一点就变得很重要了,你的结果将是错误的如果你没有。

以下是我自己的(经过测试的)实施(来自PDCLib的原始作品,即CC0 licensed)。

int strncmp( const char * s1, const char * s2, size_t n )
{
    while ( n && *s1 && ( *s1 == *s2 ) )
    {
        ++s1;
        ++s2;
        --n;
    }
    if ( n == 0 )
    {
        return 0;
    }
    else
    {
        return ( *(unsigned char *)s1 - *(unsigned char *)s2 );
    }
}

答案 1 :(得分:0)

control may reach end of non-void function

非void函数的最后一次迭代必须是return。 (你的函数返回一个int)

在某些情况下,您的代码不会使用退货。你需要一个,所以试着找到;)。

答案 2 :(得分:0)

查看您的代码:

 for ( ; num >0;  s++, t++, num--)



      if (*s == 0)
          return 0;

      if (*s == *t) {
          ++s;
          ++t;
      }

       else if (*s != *t)
          return *s - *t;
  1. 实际上,您的代码更像是这样:

    for ( ; num >0;  s++, t++, num--) {
          if (*s == 0)
              return 0;
    }
    
      if (*s == *t) {
          ++s;
          ++t;
      }
    
       else if (*s != *t)
          return *s - *t;
    
  2. 您有两个“s++; p++"

  3. 请参阅thisthis了解详情

答案 3 :(得分:0)

让我们一块一块地看一下

for ( ; num >0;  s++, t++, num--)
    if (*s == 0)
        return 0;

上面的循环增加s和t,直到num为0或者直到s指向0,在这种情况下你返回0.如果num> strlen(s)你总是返回0。

现在我们完成了循环。让我们看看接下来会发生什么......

if (*s == *t) {
    ++s;
    ++t;
}
else if (*s != *t)
    return *s - *t; 

如果s和t都指向具有相同值的字符,则它们都会递增,否则您将返回它们指向的差异。请注意,如果它们相等,则您永远不会显式返回值。这是编译器错误的原因。

然后你需要修复这个目前无可救药的算法。