用来比较字符串,比较两个字符串大小
int strcmp(const char*str1,const char *str2);
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;*/
return *str1 - *str2;
}
int main()
{
char arr1[] = "abq";
char arr2[] = "abcdef";//比较对应字符的ASC11值
//VS环境下:
//> 1
//= 0
//< -1
//若是“ab”“abcdef”则为-1
int ret = my_strcmp(arr1, arr2);
if (ret>0)//写==1不保险,即使是库函数也不可掉以轻心
printf("arr1>arr2\n");
printf("%d\n", ret);
return 0;
}
比较的不是字符串长度,而是对应字符串的内容
strcpy
strcat
strcmp
均为长度不受限制的字符串函数,均到\0为止。
但函数不安全
长度受限制字符串函数:
strncpy(,n)
strncat(,n)
strncmp(,n)
char*strncpy(char*destination,const char *source,size_t num);
int main()
{
char arr1[20] = "xxxxxxxxxxxxxx";
strncpy(arr1, "abcdef", 10);
printf("%s\n", arr1);
return 0;
}
输出abcdef0000xxxx
char*strncat(char*destination,const char* source , size_t num);
追加字符到一个字符串中去
int main()
{
char arr1[20] = "abc\0xxxxxxxx";
strncat(arr1, "defqwer", 4);
printf("%s\n", arr1);
return 0;
}
输出abcdefq
int strncmp(const char*str1,coonst char *str2,size_t num);
比较n个字符
int main()
{
char* p1 = "abcdef";
char* p2 = "abcqwer";
int ret = strncmp(p1, p2, 4);//比较4个
printf("%d\n", ret);
return 0;
}
输出-1
strstr
const char * strstr(const*str1,const char *str2);
在str1中找str2,str2在str1中第一次出现的位置,如果找到了就返回第一次出现的位置,如果找不到返回空指针
int main()
{
char arr1[] = "abbbcdbbcef";
char arr2[] = "bbc";
char* ret = my_strstr(arr1, arr2);//返回bbc中b的地址
if (ret == NULL)
{
printf("找不到\n");
}
else
{
printf("%s\n", ret);//输出bbcef
}
return 0;
}
情况一:一次即可匹配成功
abcdef //需对b进行保存
bc
情况二:多次匹配
abbbbcdef 委托两个指针让他们往后走,一次匹配不成功时,str还能回到第一个位置中来
bbc
charcp:记录当前指针从哪开始匹配
chars1:让指针围绕str1往后走
char*s2:让指针围绕str2往后走
//暴力匹配
char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && str2);
if (*str2 == '\0')
{
return (char*)str1;//将const char*强制类型转化为char*
}
const char* s1 = NULL;//没有初始化,只给了两个空指针
const char* s2 = NULL;
const char* cp = str1;//cp一定要初始化,记录起始位置
while (*cp)
{
s1 = cp;
s2 = str2;
while (*s1 !='\0' && *s2!='\0' && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return (char*)cp;
}
cp++;
}
return NULL;
}
//KMP算法也是用来字符串匹配的
char * strtok(char*str,const char*sep);
int main()
{
//char arr[] = "[email protected]";//"@."分隔符
char arr[] = "192#168.120.85";
char* p = "#.";//p指向的分隔符
char buf[20] = { 0 };//"zpengwei\0yeah\0net"
strcpy(buf, arr);
char* ret = NULL;
for (ret = strtok(buf, p); ret != NULL; ret=strtok(NULL, p))
{
printf("%s\n", ret);
}
//char* ret = strtok(buf, p);
//printf("%s\n", ret);
//ret = strtok(NULL, p);
//printf("%s\n", ret);
//ret = strtok(NULL, p);
//printf("%s\n", ret);
//zpengwei
//yeah
//net
return 0;
}
\0不能当分隔符