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

简介: 计算字符串长度 但应注意 使用 string.h头文件 strlen函数返回值为 unsigned int

@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中

   使用头文件

   但是必须保证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.用法

比较两个字符串的大小

必须使用头文件

#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函数是在一个字符串中寻找另一个字符串

必循使用头文件

#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.用法

切割字符串

  第一个参数为字符串本身 第二个参数为分隔符集合

  必须使用头文件

#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

目录
相关文章
|
存储 数据挖掘 大数据
详解阿里云数据中台,一篇文章全面了解大数据“网红”
一直想写一篇关于数据中台正面文章,现在有闲时做些总结,想充分诠释一下DT内部人如何看待数据中台。 数据中台的概念是最早由阿里巴巴首次提出,是为了应对内部众多业务部门千变万化的数据需求和高速时效性的要求而成长起来的,它既要满足业务部门日常性的多个业务前台的数据需求,又要满足像双十一,六一八这样的业务高峰、应对大规模数据的线性可扩展问题、应对复杂活动场景业务系统的解耦问题,而在技术、组织架构等方面采取的一些变革。
26825 0
|
消息中间件 存储 SQL
跨系统数据一致性方案的思考(上)
本文主要意在总结沉淀现有问题解决经验过程,整理解决跨系统数据不一致问题的经验方法。 跨系统数据一致性,比较优秀的解决方案就是微服务化,不同应用系统采用统一数据源方式,这样可以有效避免数据一致性问题。 但是我们很多系统由于历史原因或者业务缘由,导致非服务化情况下,又要采取数据一致性方案。
跨系统数据一致性方案的思考(上)
|
NoSQL 索引 MongoDB
MongoDB ObjectId详解及使用
MongoDB中我们经常会接触到一个自动生成的字段:”_id”,类型为ObjectId。 本文详解ObjectId的构成和使用。 ObjectId构成 之前我们使用MySQL等关系型数据库时,主键都是设置成自增的。
1407 0
|
4月前
|
C++
什么是单项式
单项式是代数式中的一种
|
5月前
|
JSON 数据挖掘 API
闲鱼商品列表API响应数据python解析
闲鱼商品列表API(Goodfish.item_list)提供标准化数据接口,支持GET请求,返回商品标题、价格、图片、卖家信息等。适用于电商比价、数据分析,支持多语言调用,附Python示例代码,便于开发者快速集成。
|
9月前
|
安全 算法 网络安全
数字时代的“安全结界”与“票房神话”: 从SSL证书到《哪吒之魔童闹海》的技术与人性共振
**简介:** 在2025年,全球互联网加密流量占比飙升至60%,SSL证书成为互联网“新基建”,从电商支付到社交聊天,保障数据安全。其通过加密技术(如RSA或ECC)防止信息窃取,DV、OV、EV等级别确保不同场景的安全性。SSL证书的普及源于隐私保护需求,市场呈现分层竞争。同时,《哪吒之魔童闹海》以48.39亿票房展现信任重构,其成功与SSL证书的技术逻辑异曲同工,强调内容与技术并重。两者共同揭示了数字时代“可信度”与“体验感”的双重加持,预示着未来赢家需将技术与人文融合。
|
消息中间件 存储 测试技术
流量回放的数据隔离
流量回放的数据隔离
479 4
|
关系型数据库 Linux C语言
|
算法 测试技术 语音技术
为什么你的智能硬件识别准确率低?
智能硬件的识别率提高方法
790 0
|
数据采集 关系型数据库 MySQL
把你开发的网站免费发布到互联网上(2)
我们需要将 GitHub 上的代码克隆过来,所以在 Consoles(控制台)下我们新建一个 bash 控制台。

热门文章

最新文章