1.strlen:求字符串的长度
(1)size_t strlen(const char *str)
(2)字符串以‘\0’作为结束标志,strlen函数返回的是在字符串中'\0'前面出现的字符个数(不包含'\0')
(3) 参数指向的字符茶韵必须要以'\0'结束
(4) 注意函数的返回值是size_t,是无符号的
举例代码如下:
int main(){
const char *str1 = "abcdef";
const char * str2 = "bbb";
if (strlen(str2) - strlen(str1) > 0){
printf("str2 > str1\n");
}
else{
printf("str1 > str2\n");
}
return 0;
}
( 5)模拟strlen的实现:
j方法1:计数器的方式
//(1)计数器方式
int my_strlen(const char * str){
int count = 0;
while (*str != '\0'){
count++;
str++;
}
return count;
}
int main(){
char *str = "abcdef";
int ret = my_strlen(str);
printf("此字符串的长度为:%d\n",ret);
return 0;
}
方法2:不创建临时变量计数器,递归的方式实现
//(2)不创建临时变量计数器,递归实现
int my_strlen(const char *str){
if (*str == '\0')
return 0;
else
return 1 + my_strlen(str + 1);
}
int main(){
char *str = "abcdef";
int ret = my_strlen(str);
printf("此字符串的长度为:%d\n",ret);
return 0;
}
方法3:指针——指针的方式实现
//(3)指针—指针的方式
int my_strlen(char *str){
char *p = str;
while (*p != '\0'){
p++;
}
return p - str;
}
int main(){
char *str = "abcdef";
int ret = my_strlen(str);
printf("此字符串的长度为:%d\n",ret);
return 0;
}
2.strcpy():字符串拷贝函数
(1)char * strcpy(char * dest,const char * src)
(2) 源字符串必须以'\0'结束
(3) 会将源字符串的'\0'拷贝到目标空间
(4)目标空间必须足够大,以确保能存放源字符串
(5) 目标空间必须可变
strcpy()函数的使用:
int main(){
char *str1 = "abc";
char str2[30];
int ret = strcpy(str2,str1);
printf("拷贝后的字符串为:%s\n",str2);
return 0;
}
(6)strcpy()函数的模拟实现
实现代码如下:
char * my_strcpy(char *dest,const char * src){
char *ret = dest;
assert(dest != NULL);
assert(src != NULL);
while (*dest ++ = *src++){
;
}
return ret;
}
int main(){
char *str1 = "abc";
char str2[30];
int ret = my_strcpy(str2,str1);
printf("拷贝后的字符串为:%s\n",str2);
return 0;
}
3.strcat:字符串拼接函数
(1)char * strcat(char * dest ,const char * src
(2) 源字符串必须以'\0'结束
(3) 目标空间必须足够大,能容纳下源字符串的内容
(4)目标空间必须可修改
(5)strcat()函数不能完成自己给自己追加,因为再追加时会覆盖掉‘\0’, 从而一直在追加,找不到‘\0’,程序崩溃
(6)strcat 函数的使用:
char *strcat(char *dest,const char * src);
int main(){
char arr1[20] = "hello";
char arr2[20] = "jijixiong";
strcat(arr1, arr2);
printf("%s\n",arr1);
return 0;
}
(7)strcat函数的模拟实现
//模拟实现strcat函数
char * my_strcat(char *dest,const char *src){
char * ret = dest;
assert(dest != NULL);
assert(src != NULL);
//1.找目的地空间的‘\0'
/*while (dest){}*/
while (*dest != '\0'){
dest++;
}
//2.拷贝数据
while (*dest++ = *src++){
;
}
return ret;
}
int main(){
char arr1[20] = "hello";
char arr2[20] = "jijixiong";
/*my_strcat(arr1,arr2);
printf("%s\n",arr1);*/
//链式访问
printf("%s\n",my_strcat(arr1,arr2));
return 0;
}
4. strcmp:字符串的比较函数
(1)int strcmp(const char* str1,const char * str2);
(2) 标准规定:’
str1 > str2 ,则返回大于0的数字
str1 = str2 ,则返回0
str1 < str2 ,则返回小于0的数字
(3)strcmp函数的使用:
//int strcmp(const char *str1,const char *src2);
int main(){
int ret = strcmp("hello","haha");
//printf("%d\n", ret); //1
if (ret < 0){
printf("字符串1小于字符串2!\n");
}
else if (ret == 0){
printf("字符串1等会字符串2!\n");
}
else if (ret > 0){
printf("字符串1大于字符串2!\n");
}
return 0;
}
(4)strcmp函数的模拟实现
方法1:
//方法1
int my_strcmp(const char *str1,const char *str2){
//abc \0
//abc \0
assert(str1);
assert(str2);
while (*str1 == *str2){
if (*str1 == '\0')
return 0;
str1++;
str2++;
}
/*if (*str2 > str2){
return 1;
}
else {
return - 1;
}*/
return *str1 - *str2;
}
int main(){
int ret = my_strcmp("abcd", "abcd");
if (ret < 0){
printf("字符串1小于字符串2!\n");
}
else if (ret == 0){
printf("字符串1等于字符串2!\n");
}
else if (ret > 0){
printf("字符串1大于字符串2!\n");
}
return 0;
}
方法2:
//方法2 :库中的实现
int my_strcmp(const char * src,const char * dst){
int ret = 0;
while(!(ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst == '\0'){ //字符串相等(即相减为0),且遇到‘\0’,则结束
++src;
++dst;
}
if (ret < 0){
ret = -1;
}
else if (ret > 0){
return 1;
}
return ret;
}
5. strncpy
(1) char *strncpy(char *dest,const char *source,size_t num);
(2) 拷贝num个字符从源字符串到目标空间
(3)如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
(4)strncpy函数的使用
int main(){
char arr1[20] = { 0 };
char arr2[] = "hello jijixiong";
strncpy(arr1, arr2, 5);
printf("%s\n",arr1);
return 0;
}
(5)strncpy函数的模拟实现
//库中对strncpy函数的实现
char *my_strncpy(char *dst, const char *src, size_t count){
char *start = dst;
while (count && (*dst ++ = *src ++)){ //copy string
count--;
}
if (count){ //pad out with zeros。用0填充
while (--count)
*dst++ = '\0';
}
return start;
}
6. strstr :找子串函数
(1)char *strstr(const char *,const char *)
(2)strstr函数的使用:
int main(){
char arr[] = "abcabcdef";
char * ret = strstr(arr,"abcd");
if (ret !=NULL){
printf("%s\n",ret);
}
return 0;
}
7. strn
7. strncmp
(1)int strncmp(const char * str1,const char * str2,size_t num);
(2)比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较
(3)strncmp函数的使用:
int main(){
char arr1[] = "abcdef";
char arr2[] = "abdeee";
int ret = strncmp(arr1,arr2,5);
printf("%d\n", ret);
return 0;
}
8. strtok
(1)char * strtok(char *str,const char *sep)
(2) sep参数是个字符串,定义了用作分隔符的字符集合
(3) 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记
(4) strtok函数找到str中的下一个标记,并将其用\0结尾,返回一个指向这个标记的指针。
(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改)
(5) strtok函数的第一个参数不为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
(6)如果字符串中不存在更多的标记,则返回NULL指针。
(7)strtok函数的使用
int main(){
char *p = "1850312555@qq.com";
const char *sep = ".@";
const arr[30];
char *str = NULL;
strcpy(arr, p);//将数据拷贝一份,处理arr数组的内容
for (str = strtok(arr, sep); str != NULL;str = strtok(NULL,sep)){
printf("%s\n",str);
}
return 0;
}