strcmp(字符串比较,比较两个字符串是否相等)
int strcmp ( const char * str1, const char * str2 );
int main()
{
const char* p1 = "abcdef";
const char* p2 = "sqwer";
if ("abcdef" == "sqwer")//千万不能这么比较,因为拿的是首元素地址在比较
{
}
return 0;
}
标准规定:
- 第一个字符串大于第二个字符串,则返回大于0的数字
- 第一个字符串等于第二个字符串,则返回0
- 第一个字符串小于第二个字符串,则返回小于0的数字
字符串是怎么比较的:是比字符串的多少吗?当然不是,比的是字符的ASCII码,
从第一个字符开始比,第一个字符分出大小的话就不用再往下比了,第一个字符相等,再比较第二个字符。
模拟实现:
#include<assert.h>
#include<string.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;
}
int main()
{
const char* p1 = "abcdef";
const char* p2 = "abqwe";
int ret = my_strcmp(p1, p2);
printf("%d", ret);
return 0;
}
长度受限制的字符串函数:
strncpy(字符串拷贝)
char * strncpy ( char * destination, const char * source, size_t num );
num的单位是字节,size_t是无符号整形
- 拷贝num个字符从源字符串到目标空间。不把\0拷贝过去
- 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
模拟实现这个函数自己可以做一做
strncat(字符串追加)
char * strncat ( char * destination, const char * source, size_t num );
- 目标空间必须有足够的大,能容纳下源字符串的内容。
- 源字符串必须以 '\0' 结束。
strncmp (字符串比较)
int strncmp ( const char * str1, const char * str2, size_t num );
strstr (查找字符串)
char * strstr ( const char *str1, const char * str2);
NULL--空指针
NUL或Null-'\0'
使用方法:
#include<string.h>
int main()
{
const char* p1 = "abcdefhi";
const char* p2 = "def";
const char* ret = strstr(p1, p2);
if (ret == NULL)
{
printf("子串不存在\n");
}
else
{
printf("%s\n", ret);
}
}
没有const不行,常量字符串是无法更改的,此时p1,p2为常量指针
什么是常量指针?常量指针即是指向常量的指针,指针的值可以改变,指针所指的地址中的内容为常量不能改变,
注意事项
- 如果字符串存在的话,返回在第一个字符串存在位置的第一个地址,
#include<string.h>
int main()
{
const char* p1 = "abcdefabdef";
const char* p2 = "def";
const char* ret = strstr(p1, p2);
if (ret == NULL)
{
printf("子串不存在\n");
}
else
{
printf("%s\n", ret);
}
}
此时出现了两个def,第一个位置的d地址被返回,从而打印defabdef
模拟实现:例如
abbbcdef
bbc
#include<string.h>
#include<assert.h>
const char* my_strstr(const char* p1, const char* p2)//开辟一个形参,我们只是找子字符串,不会更改里面内容
{
assert(p1 != NULL);
assert(p2 != NULL);
//特殊情况处理 p2=""
const char* s1 = p1;
const char* s2 = p2;
const char* cur = p1;
if (*p2 == '\0')
{
return p1;
}
while (*cur)//保证p1不为空字符串
{
s1 = cur;
s2 = p2;
while ((*s1!='\0')&&(*s2 != '\0') && (*s1 == *s2))
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return cur;//找到字符串
}
if (*s1 == '\0')
{
return NULL;
}
cur++;
}
return NULL;//找不到字符串
}
int main()
{
const char* p1 = "abcdefabdef";
const char* p2 = "defq";
const char* ret = my_strstr(p1, p2);
if (ret == NULL)
{
printf("子串不存在\n");
}
else
{
printf("%s\n", ret);
}
}
这个代码有点复杂,自己可以慢慢理解;
学过数据结构可以了解一下KMP算法