strcmp:函数原型是int strcmp(const char *s1,const char *s2),功能如下:若strl=str2,则返回0;若strl<str2,则返回-1;若strl>str2,则返回1。
strncmp:函数原型是int strncmp( const char * strl, const charstr2, size_t n),功能是把str1和 str2进行比较,最多比较前n个字节,若str1与str2的前n个字符相同,则返回0;若s1大于s2,则返回正数;若s1小于2则返回负数。
注意:
(1)、两者比较的方法相同,都是逐个字符去比较 ACSII码,一旦比较出大小返回。
(2)、strcmp与strncmp都是用来比较字符串的,区别在于能否比较指定长度字符串,故要多传一个长度参数,这也使得strncmp比strcmp更加精细。
strcmp
#include <stdio.h>
#include <string.h>
#include <assert.h>
int myStrcmp(char *str1, char *str2)
{
int ret = 0;
int n_str1 = 0;
int n_str2 = 0;
char *bakStr1 = str1;
char *bakStr2 = str2;
while( *str1 != 0 && *str2 != 0 && (*str1 == *str2))
{
str1++;
str2++;
}
if(*str1 || *str2)//还没到末尾就跳出上面的循环
{
str1 = bakStr1;//让str1回到bakstr1原先的位置,并根据上面跳出循环的位置进行下面操作
str2 = bakStr2;//让str2回到bakstr2原先的位置,并根据上面跳出循环的位置进行下面操作
while(*str1 != 0)
{
n_str1 += *str1;//计算str1的ACSII码
str1++;
}
while(*str2 != 0)
{
n_str2 += *str2;//计算str2的ACSII码
str2++;
}
}
ret = n_str1 - n_str2;//比较两者ACSII码的大小
if(ret < 0)
{
ret = -1;
}
if(ret > 0)
{
ret = 1;
}
return ret;
}
int main()
{
char *p1 = "abcdefg";
char *p2 = "aaceefg";
int ret = myStrcmp(p1,p2);//-1 1 0
printf("RET = %d\n",ret);
return 0;
}
b比a大1,而后面的e比d大1,所以两者的ACSII码之和相同,输出0。
strncmp
#include <stdio.h>
#include <string.h>
int main ()
{
char str1[15];
char str2[15];
int ret;
strcpy(str1, "accdef");
strcpy(str2, "abcdef");
ret = strncmp(str1, str2, 4);//比较前4个
if(ret < 0)
{
printf("str1 小于 str2");
}
else if(ret > 0)
{
printf("str2 小于 str1");
}
else
{
printf("str1 等于 str2");
}
return(0);
}
前四位中第二位时c大于b,所以str2小于str1。