1.strcmp
This function starts comparing the first character of each string. If they are equal to each other, it continues with the following pairs until the characters differ or until a terminating null-character is reached.//摘自msdn
此函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续使用以下对,直到字符消失或达到终止的空字符为止
注意:
返回值
str1 str2
1
>
0
=
-1
<
1.第一个字符串大于第二个字符串,则返回大于0的数字
2.第一个字符串等于第二个字符串,则返回0
3.第一个字符串小于第二个字符串,则返回小于0的数字
int my_strcmp(const char* str1, const char* str2)
{
const unsigned char* src1 = (const unsigned char*)str1;
//强转成const unsigned char* 是为了下面两个指针的值的ascii相减
const unsigned char* src2 = (const unsigned char*)str2;
int ret = 0;
assert(src1 != NULL && src2 != NULL);
while (!(*src1 - *src2) && *src2)//如果两个值不相等或*src2的ascii为0,
{//(*src1-*src2,所以如果*src2的ascii的值为0,那*src1就比*src2大或相等,显然结果就已知了,退出循环),
//就继续判断, 否则,求出相减的值并退出循环
src1++, src2++;
}
ret = (*src1 - *src2);
if (ret < 0)
{
return -1;
}
else if (ret>0)
{
return 1;
}
return (ret);
}
int main()
{
char str1[20]= "abcd";
char str2[20] = "abcdef";
printf("%d\n",my_strcmp(str1, str2));
return 0;
}
运行结果:
2.strncmp
strncmp比较两个字符串前n个字符,其他内容和strcmp一样。
int my_strncmp(const char* str1, const char* str2,size_t n)//比较两个字符串前n个字符
{
const unsigned char* src1 = (const unsigned char*)str1;
//强转成const unsigned char* 是为了下面两个指针的值的ascii相减
const unsigned char* src2 = (const unsigned char*)str2;
int ret = 0;
assert(src1 != NULL && src2 != NULL);
while (!(*src1 - *src2) && *src2 && n > 0 )//如果两个值不相等或*src2的ascii为0,
{//(*src1-*src2,所以如果*src2的ascii的值为0,那*src1就比*src2大或相等,显然结果就已知了,退出循环),
//就继续判断, 否则,求出相减的值并退出循环
src1++, src2++,n--;
}
ret = (*(--src1) - *(--src2));//比较n个字符指针移动到了n+1个位置,-1返回n的范围内
if (ret < 0)
{
return -1;
}
else if (ret>0)
{
return 1;
}
return (ret);
}
int main()
{
char str1[20]= "abcd";
char str2[20] = "abcdef";
printf("%d\n",my_strncmp(str1, str2,4));
return 0;
}
运行结果: