字符串函数(一)之常见用法
【摘要】 @TOC 前言 一.strlen函数 1.用法计算字符串长度 但应注意 使用 string.h头文件strlen函数返回值为 unsigned int#include<stdio.h>#include<string.h>int main(){ if(strlen("abc")-strlen("abcdef")>0) { printf(">\n"); } else { print...
@TOC
前言
一.strlen函数
1.用法
计算字符串长度
但应注意 使用 string.h头文件
strlen函数返回值为 unsigned int
#include<stdio.h>
#include<string.h>
int main()
{
if(strlen("abc")-strlen("abcdef")>0)
{
printf(">\n");
}
else
{
printf("<"\n);
}
return 0;
}
如果我们正常来看 strlen(“abc” )---- 3 strlen("abcdef’)----6
3-6应为 -3 但是-3为无符号数 所以应该输出-3的补码
即一个很大的数 为 >
2.模拟实现strlen函数
#include<stdio.h>
#include<assert.h>
int mystrlen(const char*str)//const 在*左边代表指针指向的内容不能被改变 ,指针本身可以改变
{
assert(str!=NULL);
int sum=0;
while(*str!='\0')
{
sum++;
str++;
}
return sum;
}
int main()
{
char arr[]="hello";
int ret=mystrlen(arr);
printf("%d\n",ret);//5
return 0;
}
二.strcpy函数
1.用法
拷贝函数
将arr2拷贝到arr1中
使用头文件<string.h>
但是必须保证arr1能够放下arr2
需要注意的是 拷贝时 将’\0’也会拷贝过去
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[20]="XXXXXXXX";
char arr2[]="hello";
strcpy(arr1,arr2);
printf("%s\n",arr1);//hello
return 0;
}
2.模拟实现strcpy函数
#include<stdio.h>
#inlcude<assert.h>
char* mystrcpy(char*dest,const char*src)//这里的src为要传递arr2,不能改变src指针本身
{
asser(src!=NULL&&dest!=NULL);
char*ret=dest;
while(*dest++=*src++)
{
;
}
return ret;
}
int main()
{
char arr1[20]="XXXXXXXX";
char arr2[]="hello";
mystrcpy(arr1,arr2);
return 0;
}
三.strcat函数
1.用法
字符串追加
但是必须保证arr1数组足够大
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[20]="hello ";
char arr2[]="world";
strcat(arr1,arr2);
printf("%s\n"arr1);//hello worlld
return 0;
}
2.模拟实现strcat函数
#include<stdio.h>
#include<assert.h>
char* strcat(char*dest,const char*src)//srcu所指向的内容不可以改变 指针本身可以改变
{
assert(dest&&src);
char*ret=dest;
while(*dest!='\0')
{
dest++;
}
while(*src!='\0')
{
*dest=*src;//如果dest加上const 此句就会报错
dest++;
src++;
}
return ret;
int main()
{
char arr1 [20]="hello ";
char arr2[]="world";
char*ret=mystrcat(arr1,arr2);
printf("%s\n,rett);//hello world
return 0;
}
四.strcmp函数
1.用法
比较两个字符串的大小
必须使用头文件 <string.h>
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[]="abbb";
char arr2[]="abq";
if(srcmp(arr,arr2)>0)//abbb<abq
{
printf(">"\n);
}
else
{
printf("<"\n);
}
return 0;
}
使用方法: 从首字符开始 如果两者相等 则继续向下
若在某个字符 第一个字符大于第二个字符 则数组1>数组2
若 在某个字符 第一个字符小于第二个字符 则数组1<数组2
例:
abbb
abq
b<q 所以abbb<abq
2.模拟实现strcmp函数
#include<stdio.h>
#include<assert.h>//const和assert断言都可不加 加上是为了代码的健壮
int mystrcmp(const char*s1,const char*s2)
{
assert(s1&&s2);
while(*s1==*s2)
{
if(*s2=='\0')
{
return 0;
}
s1++;
s2++;
}
if(*s1>*s2)
{
return 1;
}
else
{
return -1;
}
int main()
{
char arr1[]="abbb";
char arr2[]="abq";
int ret= mystrcmp(arr1,arr2);
printf("%d\n",ret);//-1
return 0;
五.strstr函数
1.用法
strstr函数是在一个字符串中寻找另一个字符串
必循使用<string.h>头文件
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[]="abcdefabcdef";
char arr2[]="bcd";
char*p=strstr(arr1,arr2);
if(p==NULL)
{
printf("没找到\n");
}
else
{
printf("找到了:%s\n",p);//bcdefabcdef
}
return 0;
}
如果没找到 返回 NULL
如果找到了返回第一次出现的位置
2.模拟实现strstr函数
#include<stdio.h>
#include<assert.h>
char*mystrstr(const char*str1,const char*str2)
{
const char*s1=str1;
const char*s2=str2;
const char*cp=str1;
if(*s2==='\0')
{
return (char*)str1;//str1也为const修饰的 所以需要强制类型转换
}
while(*cp)
{
s1=cp;
s2=str2;
while(*s1&&*s2&&(*s1==*s2))//为了防止两者相同的情况发生
{
s1++;
s2++;
}
if(*s2=='\0')
{
return (*cp);//cp为const修饰的 想要返回char* 要强制类型转换
}
cp++;
}
return NULL;
int main()
{
char arr1[]="abbbcdef";
char arr2[]="bbc";
char*p=mystrtsr(arr1,arr2);
if(p==NULL)
{
printf("没找到\n");
}
else
{
printf(找到了:%s",p);//bbcdef
}
return 0;
}
六.strtok函数
1.用法
切割字符串
第一个参数为字符串本身 第二个参数为分隔符集合
必须使用<string.h>头文件
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = "2637@qq.com";
const char* p = "@ .";
char tmp[20] = { 0 }; //strtok一般会切割字符串 所以用临时拷贝
strcpy(tmp, arr);
char* ret = NULL;
ret = strtok(tmp, p);//第一次传字符串本身 会将第一次遇见的分隔符变成'\0'并返回起始位置地址
printf("%s\n", ret);
ret = strtok(NULL, p);//为NULL时 在上次分隔符开始 直到再次遇见分隔符 变成'\0'
printf("%s\n", ret);
ret = strtok(NULL, p);
printf("%s\n", ret);
return 0;
}
结果为 2637 qq com
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)