计算字符串长度 但应注意 使用 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的补码 即一个很大的数 为 >
#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;
}
拷贝函数 将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;
}
#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;
}
字符串追加 但是必须保证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;
}
#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;
}
比较两个字符串的大小 必须使用头文件 <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
#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函数是在一个字符串中寻找另一个字符串 必循使用<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 如果找到了返回第一次出现的位置
#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;
}
切割字符串 第一个参数为字符串本身 第二个参数为分隔符集合 必须使用<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