我有一个带有测试驱动程序的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;
}
答案 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;
答案 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都指向具有相同值的字符,则它们都会递增,否则您将返回它们指向的差异。请注意,如果它们相等,则您永远不会显式返回值。这是编译器错误的原因。
然后你需要修复这个目前无可救药的算法。