一、C语言中常见的字符函数
二、strcmp函数以及其模拟实现
strcmp函数的演示
//一、比较两个字符串,前面的字符串和后面的字符串,进行字典序比较
int ret = strcmp("abcdef", "abq");
printf("%d", ret);
if (ret > 0)//返回值大于0,前字符串比后大
{
printf(">");
}
else if(ret==0)//等于0,相等
{
printf("==");
}
else//剩下小于
{
printf("<");
}
运行结果:
上述代码中,两个字符串进行比较,在比较第三个元素的过程中,'c’比’q’的Ascii码值小,因此strcmp返回值<0.
strcmp函数模拟实现
my_strcmp(const char* s1, const char* s2)
{
assert(s1!=NULL);//确保传过来的地址不为空指针
assert(s2 != NULL);
while (*s1 == *s2)//如果比较的元素相等,则进入循环实现s1++,s2++将字符数组遍历
{
if (*s1 == '\0')//两个字符串在比较过程中一直处于相等状态,那就返回0
{
return 0;
}
s1++;//遍历数组
s2++;//遍历数组
}
if (*s1 > *s2)//当比较过程中s1中的元素比s2大,则返回大于0的值
{
return 1;
}
else//当比较过程中s1中的元素比s2小,则返回大于0的值
{
return -1;
}
}
int ret = my_strcmp("abcdef", "abq");
printf("%d", ret);
三、strncpy函数
strncpy函数的作用是,将源头字符串复制给目标字符串。第三个参数传的是需要拷贝的大小。
char arr1[10] = "xxxxxxxxxx";
char arr2[] = "ab";
strncpy(arr1, arr2, 5);
这是代码经过调试的结果,需要复制五个字节大小的字符到arr1
中,但是arr2大小只有3个字节。这种情况下超出的字节用’\0’补齐。
四、strncat函数
作用是连接字符串,而使用strncat函数可以自定义连接字符串的长度。
char arr1[20] = "abc\0xxxxxxxxxxx";
char arr2[] = "def";
strncat(arr1, arr2, 5);//arr1是目的追加字符串,从目的追加字符串的\0字符开始追加。若arr2中字符个数小于追加数n,则追加够为止。
函数调试过程:
五、strstr函数
strstr函数的演示
作用:strstr函数。在一个字符串中查找另一个字符串。
char arr1[] = "abcdefabcdef";
char arr2[] = "def";
char* ret = strstr(arr1,arr2);
printf("%s", ret);
程序运行结果:
因此strstr函数返回的是’d’的地址,通过地址我们可以打印d以后的字符串。
strstr函数的模拟实现
实现逻辑:
const char* my_strstr(const char* str1, const char* str2)
{
assert(str1);
assert(str2);
const char* s1 = str1;//因为strstr实现的过程中要遍历字符数组,所以初始地址尽量不能改变,采用一个变量存储初始地址值,这里作用是存储目标地址
const char* s2 = str2;//存储源头字符串地址。
const char* cp = s1;
if (*s2 == '\0')//如果源头字符串,是‘\0’则不用寻找直接返回
{
return s1;
}
while (*s1)//s1是用来存放可能匹配成功字符的地址。
{
cp=s1;//cp用来遍历可能成功的字符串数组。
while (*cp == *s2 && *cp && *s2)//当两地址指向字符相等,而且指向字符不为‘\0’时候进入循环
{
cp++;//遍历str1的过程
s2++;//遍历str2的过程
if (*s2 == '\0')//若遍历过程中s2=='\0'则代表str2所指向的字符串在str1中可以找到,返回此时可能成功匹配的地址。
{
return s1;
}
}
s1++;//不能成功匹配,切换到下一个可能成功的地址
s2 = str2;//指向str2最初地址,为下一次循环匹配做准备
}
}