memcmp/strcmp和strncmp的区别
memcmp/strcmp和strncmp的区别
在C语言的string.h库中,有这样3个相似的函数:memcmp,strcmp,strncmp。他们的原型分别如下:
/************************************************************************
*功能:把存储区 str1 和存储区 str2 的前 n 个字节进行比较
*输入:str1:要比较的字符串
* str2:要比较的字符串
* n:要比较的字节数
*输出:无
*返回:str<str2,<0;str1=str2,=0;str1>str2,>0
************************************************************************/
int memcmp(const void *str1, const void *str2, size_t n);
/************************************************************************
*功能:把 str1 所指向的字符串和 str2 所指向的字符串进行比较
*输入:str1:要进行比较的第一个字符串。
* str2:要进行比较的第二个字符串。
*输出:无
*返回:返回值小于 0,则表示 str1 小于 str2。
* 返回值大于 0,则表示 str1 大于 str2。
* 返回值等于 0,则表示 str1 等于 str2。
************************************************************************/
int strcmp(const char *str1, const char *str2);
/************************************************************************
*功能:把 str1 和 str2 进行比较,最多比较前 n 个字节
*输入:str1:要进行比较的第一个字符串。
* str2:要进行比较的第二个字符串。
* n:要比较的最大字符数
*输出:无
*返回:返回值小于 0,则表示 str1 小于 str2。
* 返回值大于 0,则表示 str1 大于 str2。
* 返回值等于 0,则表示 str1 等于 str2。
************************************************************************/
int strncmp(const char *str1, const char *str2, size_t n);
他们的区别如下:
- memcmp是比较两个存储空间的前n个字节,即使字符串已经结束,仍然要比较剩余的空间,直到比较完n个字节。
- strcmp比较的是两个字符串,任一字符串结束,则比较结束。
- strncmp在strcmp的基础上增加比较个数,其结束条件包括任一字符串结束和比较完n个字节。
举例说明
void display(int ret)
{
if(ret > 0)
printf("str1 大于 str2\r\n");
else if(ret < 0)
printf("str1 小于 str2\r\n");
else
printf("str1 等于 str2\r\n");
}
int main()
{
char str1[10] = {"12345"};
char str2[10] = "12345";
int n = 8;
int ret,i;
str1[5] = 0;
memset(str1 + 6,'1',4);//在str1后面添加字符‘1’
printf("str1:%s\r\n",str1);
printf("str2:%s\r\n",str2);
printf("str1空间:");
for(i = 0;i<sizeof(str1);i++)
printf("%d ",str1[i]);
printf("\r\nstr2空间:");
for(i = 0;i<sizeof(str2);i++)
printf("%d ",str2[i]);
printf("\r\n使用 strcmp 比较:");
ret = strcmp(str1, str2);
display(ret);
printf("\r\n使用 memcmp 比较前%d字节:",n);
ret = memcmp(str1, str2,n);
display(ret);
printf("\r\n使用 strncmp 比较前%d字节:",n);
ret = strncmp(str1, str2,n);
display(ret);
printf("\r\n");
system("pause");
return 0;
}
运行结果如下图:
从运行结果可以看出,str1整个空间实际存储的数要大,但是str1和str2含有相同的字符串。
使用strcmp比较时,只比较到字符串结束,所以str1等于str2;使用memcmp比较时,比较n个字节空间的大小,所以str1大于str2;使用strncmp比较时,也是比较到字符串结束,所以只比较到前5个字节,所以str1等于str2。
原创不易,转载请表明出处。
附录:源码实现
/************************************************************************
*功能:把存储区 str1 和存储区 str2 的前 n 个字节进行比较
*输入:str1:要比较的字符串
* str2:要比较的字符串
* n:要比较的字节数
*输出:无
*返回:str<str2,<0;str1=str2,=0;str1>str2,>0
************************************************************************/
int Mymemcmp(const void *str1, const void *str2, size_t n)
{
char *temp1,*temp2;
if(str1 == NULL || str2 == NULL)
{
printf("字符串不能为空!\r\n");
exit(-1);
}
temp1 = (char *)str1;
temp2 = (char *)str2;
while(n --)
{
if(*temp1 > *temp2)
return 1;
else if(*temp1 < *temp2)
return -1;
temp1 ++;
temp2 ++;
}
return 0;
}
/************************************************************************
*功能:把 str1 所指向的字符串和 str2 所指向的字符串进行比较
*输入:str1:要进行比较的第一个字符串。
* str2:要进行比较的第二个字符串。
*输出:无
*返回:返回值小于 0,则表示 str1 小于 str2。
* 返回值大于 0,则表示 str1 大于 str2。
* 返回值等于 0,则表示 str1 等于 str2。
************************************************************************/
int Mystrcmp(const char *str1, const char *str2)
{
char *temp1,*temp2;
if(str1 == NULL || str2 == NULL)
{
printf("字符串不能为空!\r\n");
exit(-1);
}
temp1 = (char *)str1;
temp2 = (char *)str2;
while(*temp1 != 0 || *temp2 != 0)
{
if(*temp1 > *temp2)
return 1;
else if(*temp1 < *temp2)
return -1;
temp1 ++;
temp2 ++;
}
return 0;
}
/************************************************************************
*功能:把 str1 和 str2 进行比较,最多比较前 n 个字节
*输入:str1:要进行比较的第一个字符串。
* str2:要进行比较的第二个字符串。
* n:要比较的最大字符数
*输出:无
*返回:返回值小于 0,则表示 str1 小于 str2。
* 返回值大于 0,则表示 str1 大于 str2。
* 返回值等于 0,则表示 str1 等于 str2。
************************************************************************/
int Mystrncmp(const char *str1, const char *str2, size_t n)
{
char *temp1,*temp2;
if(str1 == NULL || str2 == NULL)
{
printf("字符串不能为空!\r\n");
exit(-1);
}
temp1 = (char *)str1;
temp2 = (char *)str2;
while((*temp1 != 0 && *temp2 != 0) && n--)
{
if(*temp1 > *temp2)
return 1;
else if(*temp1 < *temp2)
return -1;
temp1 ++;
temp2 ++;
}
if(n)//由于字符串结束而提前结束
{
if(*temp1 == 0 && *temp2 != 0)//str1比str2短
return -1;
else if(*temp1 != 0 && *temp2 == 0)//str1比str2长
return 1;
else
return 0;
}
return 0;
}