?
目录
1.求字符串长度函数
strlen
2.长度不受限制字符串
① strcpy
?②strcat
③strcmp
3.长度受限制的字符串函数
① strncpy
② strncat
③ strncmp
3.字符串查找函数
strstr
前言
c语言中对字符和字符串的处理是很频繁的,但是C语言尴尬在本身是没有字符串类型的,而字符串通常在C语言中是放在常量字符串中或者是字符数组中.
字符串常量适用于那些不会对它进行修改的字符串函数.
1.求字符串长度函数
strlen
求字符串长度函数
函数声明: size_t strlen(const char* str)
①:字符串以?' \0 '作为结束标志,strlen函数返回的是在字符串中?' \0 ' 前面出现的字符个数(不包含' \0 ').
②:参数指向的字符串必须要以' \0 '作为结束标志!
③:注意函数的返回值为size_t(无符号类型).
④:学会strlen函数的模拟实现.
strlen的使用:
#include <string.h>//字符串函数头文件都为string.h
int main()
{
char arr[] = "abcdefhgsaidiowqbnjcdankljasd";
printf("%d", stlen(arr));//直接使用链式调用把string返回值打印出来
return 0;
}
strlen的模仿实现:
int my_strlen(const char* str)//因为我们只是数有多少个字符并不对字符串进行修改故参数设置为const确保安全
{
assert(str);
int count = 0;//计数器
while (*str++)//如果*str=\0的时候结果为假,循环停止.++为后置++先使用后加加
{
count++;
}
return count;
}
int main()//---模仿strlen
{
char arr[] = "abcdefhgsaidiowqbnjcdankljasd";
printf("%d", my_strlen (arr));
return 0;
}
有人会奇怪库函数声明返回函数是size_t的 为什么我的模仿实现要是int的呢?看一段代码:
#include <stdio.h>
int main()
{
const char*str1 = "abcdef";
const char*str2 = "bbb";
if(strlen(str2)-strlen(str1)>0)
{
printf("str2>str1\n");
}
else
{
printf("srt1>str2\n");
}
return 0; }
如果是用size_t的话 那么这个的结果会很尴尬 永远都是str2>str1 所以我们自己模仿实现的时候就用int,个人觉得这个函数用size_t作为返回值的类型会比较尴尬~?
2.长度不受限制字符串
① strcpy
作用:将源字符串内容拷贝到目的地字符串中,并返回目的地字符串起始地址
函数声明:char* strcpy(char * destination, const char * source );
①:源字符串中必须以 '\0'结尾!
②:会将原字符串中的'\0'拷贝到目标空间
③:目标空间必须足够大,以确保能够放下源字符串
④:目标空间必须可变(不可是一个指针指向一个常量字符串!)
⑤:学会模拟实现
strcpy的使用
#include <string.h>
int main()
{
char arr1[30] = "xxxxxxxxxxxxxxxxxxxxxx";
char arr2[] = "hello world";
printf("%s\n", strcpy(arr1, arr2));
return 0;
}
strcpy的模拟实现
char* my_strcpy(char* dest, const char* src)//源字符串不做修改,const修饰确保安全
{
char* str = dest;//记录目的地字符串起始地址
assert(dest && src);
while (*dest++ = *src++)//利用++先使用后++的特性直接进行拷贝
{
;
}
return str;
}
int main()
{
char arr1[30] = "xxxxxxxxxxxxxxxxxxxxxx";
char arr2[] = "hello world";
printf("%s\n", my_strcpy(arr1, arr2));
return 0;
}
结果为:
?②strcat
作用:字符串连接or字符串追加,将源字符串追加至目的地字符串后面,并且返回目的地字符串起始地址
函数声明:char * strcat ( char * destination, const char * source );
①:源字符串必须以'\0'结束!
②:目标空间必须有足够大,能容纳下源字符串的内容
③:目标空间必须可修改(不可是常量字符串)
④:模拟实现strcat
strcat的使用?
#include <string.h>
int main()
{
char arr1[30] = "hello ";
char arr2[] = "world";
printf("%s", strcat(arr1, arr2));
return 0;
}
strcat的模拟实现?
char* my_strcat(char* dest, const char* src)
{
char* str = dest;
assert(dest && src);
while (*dest)//先定位到目的地字符串中的\0
{
dest++;
}
while (*dest++ = *src++)//进行拷贝
{
;
}
return str;
}
int main()//---模拟实现strcat
{
char arr1[30] = "hello ";
char arr2[] = "world";
printf("%s", my_strcat(arr1, arr2));
return 0;
}
③strcmp
作用:比较两个字符串中对应的字符哪个更大,第一个字符串大于第二个字符串返回大于0的数字,相等返回0,第一个小于第二个返回小于0的数字
函数声明:int strcmp ( const char * str1, const char * str2 );
strcmp的使用:?
int main()
{
char arr1[] = "abcdef";
char arr2[] = "bbq";
int a = strcmp(arr1, arr2);
if (a > 0)
printf("arr1>arr2");
else if (a < 0)
printf("arr1<arr2");
else
printf("arr1==arr2");
return 0;
}
strcmp的模拟实现:?
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
while (*str1 == *str2)
{
if (*str1 == '\0')
return 0;
str1++;
str2++;
}
return *str1 - *str2;
}
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abcdef";
int a = my_strcmp(arr1, arr2);
if (a > 0)
printf("arr1>arr2");
else if (a < 0)
printf("arr1<arr2");
else
printf("arr1==arr2");
return 0;
}
3.长度受限制的字符串函数
① strncpy
作用:拷贝num个字符从源字符串到目标空间。
函数声明:char * strncpy ( char * destination, const char * source, size_t num );
如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
strncpy的模拟实现:
char* my_strncpy(char* dest, const char* src, size_t num)
{
char* set = dest;
assert(dest && src);
while (num)
{
if (*src != '/0')
{
*dest = *src;
src++;
}
else
{
*dest = '/0';
}
dest++;
num--;
}
return set;
}
int main()//--模仿strncpy
{
//保证目标字符串空间足够大
char arr1[30] = "xxxxxxxxxx";
char arr2[] = "hellowor";
printf("%s\n",my_strncpy(arr1, arr2, 5));
return 0;
}
?
② strncat
作用:在目的地字符串后面追加num个源字符串中的字符
函数声明:char * strncat ( char * destination, const char * source, size_t num );
如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
?strncat的模拟实现
char* my_strncat(char* dest, const char* src, size_t num)
{
char* str = dest;
assert(dest && src);
while (*dest)
{
dest++;
}
while (num)
{
if (*src != '\0')
{
*dest = *src;
src++;
}
else
{
*dest = '\0';
}
dest++;
num--
;
}
if (*src)
{
*dest = '\0';
}
return str;
}
int main()//--模仿strncat
{
char arr1[30] = "xxxxx\0xxxxx";
char arr2[] = "abc";
printf("%s\n", my_strncat(arr1, arr2, 5));
return 0;
}
③ strncmp
作用:比较两个字符串中的num个字符比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。
函数声明:int strncmp ( const char * str1, const char * str2, size_t num );
strncmp模拟实现:
int my_strncmp(const char* str1, const char* str2, size_t num)
{
assert(str1 && str2);
if (!num)
{
return 0;
}
size_t x = num;
for (; x < num; x++)
{
if (*str1 != '\0' || *str1 != *str2)
return *(unsigned char*)str1 - *(unsigned char*)str2;//无符号类型返回下面以有符号打印也是对的结果
str1++;
str2++;
}
}
int main()//--模仿strncmp
{
char arr1[] = "abcdef";
char arr2[] = "abccde";
printf("%d", my_strncmp(arr1, arr2, 4));
return 0;
}
?
3.字符串查找函数
strstr
作用:查找源字符串是否为目的地字符串的字串 找到了则返回一个指向str1中第一次出现str2的指针,如果str2不是其中的一部分,则返回一个空指针
函数声明:char * strstr ( const char *str2, const char * str1);
strstr函数的使用
int main()//
{
char arr1[] = "abbbcdef";
char arr2[] = "bbc";
char* ret = strstr(arr1, arr2);
if (NULL == ret)
printf("没找到\n");
else
printf("找到了\n");
return 0;
?strstr函数的模拟实现:
char* my_strstr(const char* str, const char* substr)
{
const char* s1 = NULL;//用于移动和源字符中的字符做比较
const char* s2 = NULL;//用于记录源字符和目的地字符是否相等
const char* ctr = str;//记录查找开始的地址
assert(str && substr);
if (substr == '\0')//如果substr一开始就为\0 则返回substr
{
return (char*)substr;
}
while (*ctr)//用ctr记录本次查找开始的地址
{
s1 = ctr;
s2 = substr;
while (*s1 && *s2 && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')//如果s2一旦=\0 那么就证明substr是str中的子串 返回这个子串开始的地址
return (char*)ctr;
ctr++;
}
return NULL;
}
int main()//---模仿strstr
{
char arr1[] = "abbbcdef";
char arr2[] = "bbc";
char* ret = my_strstr(arr1, arr2);
if (NULL == ret)
printf("没找到\n");
else
printf("找到了\n");
return 0;
}
这就是字符串函数一的内容啦~如果有什么不懂的可以留言我来解答哈~看完对您有帮助的话点个赞吧~~~?
?
|