内容重点:
重点介绍处理字符和字符串的库函数的使用和注意事项
下面是将要介绍的几个函数:
- 求字符串长度 strlen
- 长度不受限制的字符串函数 strcpy strcat strcmp(本节)
- 长度受限制的字符串函数介绍 strncpy strncat strncmp
- 字符串查找 strstr strtok
- 错误信息报告 strerror
- 字符操作
- 内存操作函数 memcpy memmove memset memcmp
strcmp
int strcmp ( const char * str1, const char * str2 );
译文:
比较两个字符串
将C字符串str1与C字符串str2进行比较。
此函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续使用以下对,直到字符不同或达到终止的null字符为止。
此函数执行字符的二进制比较。有关考虑区域设置特定规则的函数,请参阅strcoll。
返回值:
比较规则:
- 第一个字符串大于第二个字符串,则返回大于0的数字
- 第一个字符串等于第二个字符串,则返回0
- 第一个字符串小于第二个字符串,则返回小于0的数字
注意:这里比较的是ASCII的值,而与字符串的长度无关!同时执行过程为从头到尾挨个进行,直到找到两个数组中不相同的字符时才开始比较。
1.使用示例(需要比较字符串的情况下)
错误示例:
if ("abcdef" == "bcdefg") //这里比较的是两个字符串首字符的地址,而不是字符串的内容
这里用判断的==是两个字符串的首个字符的地址是否相等,而不是比较字符串长度。
同时注意,比较两个字符串内容的时候,不能使用==,应该使用strcmp。
正确示例:
示例1
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<string.h>
#include<assert.h>
int main()
{
char arr1[] = "abcdef";
char arr2[] = "bdcef";
int ret = strcmp(arr1, arr2);
printf("%d\n", ret);
return 0;
}
输出结果为:
解释:
从头开始a的ASCII值小于b的ASCII的值,因此arr1的内容小于arr2的内容,故输出的值小于0
示例2
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<string.h>
#include<assert.h>
int main()
{
char arr1[] = "abcdeg";
char arr2[] = "abcdefgh";
int ret = strcmp(arr1, arr2);
printf("%d\n", ret);
return 0;
}
输出结果:
解释:
从头开始两个数组的内容一直相等,直到第六位时开始不同,g的ASCII值大于f的ASCII的值,因此arr1的内容大于arr2的内容,故输出的值大于0
示例3
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<string.h>
#include<assert.h>
int main()
{
char arr1[] = "abcdefgh";
char arr2[] = "abcdefgh";
int ret = strcmp(arr1, arr2);
printf("%d\n", ret);
return 0;
}
输出结果:
解释:
从头开始到尾两个数组的内容一直相同,故输出的值等于0。
2.模拟实现
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<string.h>
#include<assert.h>
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
while (*str1 == *str2)
{
if (*str1 == '\0')
return 0;
str1++;
str2++;
}
//if (*str1 > *str2)
//return 1;
//else
//return -1;//这里模拟vs的返回值1或者-1
return *str1 - *str2;//这里的返回的值是ASCII值相减
}
int main()
{
char arr1[] = "abzcde";
char arr2[] = "abq";
printf("%d\n", my_strcmp(arr1, arr2));
return 0;
}
输出结果:
注意,如果要写成下面的代码时
if(strcmp(arr1,arr2)==1);//尽量写成if(strcmp(arr1,arr2)>0);
printf(">");
尽量写成
if(strcmp(arr1,arr2)>0);
printf(">");
因为在vs的编译情况下输出结果才为0,-1,1这三个值。为了防止在其他编译器情况不可以,尽量写成>0的形式。