字符串函数(一)之常见用法

举报
lovevivi 发表于 2022/08/12 12:41:08 2022/08/12
【摘要】 @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 NULLint 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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。