字符串处理函数

不举步,越不过栅栏,不迈腿,登不上高山。

测量字符串长度

概述

测量字符指针指向的字符串中字符的个数,不包括'\0'

语法

strlen(char *)

返回值:字符串中字符个数

示例

#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
    char *s = "hello";
    char s1[20] = "hello";
    printf("%d\n",strlen(s));
    printf("%d\n",sizeof(s1));
    printf("%d\n",sizeof(s));
    return 0;
}

sizeof是个关键字,测量数据的占用内存空间大小

如果测量的是数组名字,则测的是数组占多少个字节

如果sizeof测的是指针变量,则测的是指针变量本身占几个字节,32平台下显示结果是4

strlen是个库函数,测量的是指针指向的字符串的个数,不管指针是数组名字还是指针变量

字符串拷贝函数

语法

char *strcpy(char *dest,char *src);

概述

拷贝src指向的字符串到dest指针指向的内存中,'\0'也会拷贝

返回值

目的内存的地址

注意:

在使用此函数时,必须保证新的指向的内存空间足够大,否则会出现内存污染

语法

char *strncpy(char *dest,char *src,n);

概述

将src指向的字符串前n个字节,拷贝到dest指向的内存中

返回值

目的内存的首地址

注意:

        1.strncpy不拷贝'\0'

        2.如果n大于src指向的字符串中字符的个数,则在dest后面填充 n - strlen(src)个'\0'

示例

#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
    
    char buf[100]="aaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
    strncpy(buf,"helloworld",5);
    printf("%s\n",buf);
    return 0;
}

结果为 helloaaaaaaaaaaaaaaaaaaaaaaaa。验证不拷贝'\0'

字符串追加函数

语法

char *strcat(char *dest,char *src);

概述

strcat函数追加src字符串到dest指向的字符串的后面。追加的时候会追加’\0‘

注意:要保证dest指向的内存空间足够大

void fun01()
{
    char *p = "world";
    char str[20] ="hello\0jjjjjjjjjj";
    strcat(str,p);
    printf("%s\n",str);   //追加字符串的时候会追加'\0'
}

语法 

 char *strncat(char *dest,char *src,n)

概念 

追加src指向的字符串的前n个字符,到dest指向的字符串的后面

注意如果n大于src的字符个数,则只将src字符串追加到dest指向的字符串的后面追加的时候会追加'\0'

void fun01()
{
    char *p = "world";
    char str[20] ="hello";
    strncat(str,p,3);
    printf("%s\n",str);
}

判断字符串大小是否相等

 strcmp/strncmp区别

定义

int strcmp(char *sl,char *s2);

概述

比较s1与s2指向的字符串大小

比较方法:逐个字符比较ascll码,比较出大小时返回

如果所有字符都一样,则返回0

返回值:

如果s1指向的字符串大于s2指向的字符串        返回值大于0

如果s1指向的字符串小于s2指向的字符串        返回值小于0

如果相等返回0

语法 

int strncmp(char *s1,char *s2,n);

概述

比较s1和s2指向的字符串中前n个字符

void fun02()
{
    char *p = "hello world";
    char *g = "hello world";
    printf("%d\n",strncmp(g,p,5));
}

 字符查找函数

语法

char *strchr(char *s,int c)

概述

在字符指针s指向的字符串中,找到ascll码为c的字符

注意

首次匹配,当s指向的字符串中有多个ascll为c的字符,则返回的是第一个字符的返回值

返回值:

返回找到的字符的地址

找不到时返回NULL

语法

char *strrchr(char *s,int c);

概述

在s指向的字符串中,找到最后一次出现ascll为c的字符

返回值

末次匹配的字符的地址

字符串匹配函数

语法

char *strstr(char *hay, char *nee);

概述

首次匹配时在hay指向的字符串中查找nee指向的字符串

返回值

找到时返回字符串的首地址

没找到时返回NULL

void fun02()
{
    char *p = "hello world";
    char *g = "hello";
    printf("%p\n",strstr(p,g));
}

字符串转换数值

atoi       转换为整型

atol       转换为长整型

atof        转换为浮点型

语法

int atoi(char *npt);

概述

将 npt指向的字符串转换成整数返回

示例

void fun03()
{
    int num =atoi("123");
    printf("%d\n",num);
}

 字符串切割函数

语法

char *strtok(char *str,char *deli);

概述

 字符串切割,按照deli指向的字符串中的字符,切割str指向的字符串。其实就是在str指向的字符串中发现deli字符串中的字符,将其变为'\0'。调用一次strtok只切割一次,切割一次之后,在切割的时候strtok的第一个参数为NULL,意思是接着上次切割的位置继续切

注意

如果str字符串中出现了连续的几个deli中的字符,则将第一个字符变成’\0‘

void fun04()
{
    char s[] = "123,,,...456##..789,,..";
    char *buf[3] = {s,NULL};
    int i = 0;
    char *p = ",.#";
    while(1)
    {
        buf[i] = strtok(buf[i],p);
        if (buf[i] == NULL)
        {
            break;
        }
        i++;
    }
    for (int i = 0; i < 3; i++)
    {
        printf("%s\n",buf[i]);
    }
    
}

格式化字符串操作函数

int sprintf(char *buf,char *format,...) 

概述

输出到buf指定的内存区域

示例

void fun05()
{
    char p[20];
    sprintf(p,"%d/%d/%d",2023,11,6);
    printf("%s\n",p);
}

语法

int sscanf(char *buf,char *format,...);

概述

从buf指定的内存区域中读取信息

示例

void fun05()
{
    int a, b, c;
    sscanf("2023:11:6", "%d:%d:%d", &a, &b, &c);
    printf("%d %d %d\n",a,b,c);
 }

 sscanf高级用法
1.跳过数据:%*s或%*d

示例

void fun05()
{
    char p[20];
    sscanf("123 567","%*d %s",p);
    printf("%s\n",p);
 }

2.读取指定宽度的数据

 示例

void fun05()
{
    char p[20];
    sscanf("123567","%5s",p);
    printf("%s\n",p);
 }

3.支持集合操作,但只支持获取字符串

%[a-z] 表示匹配a到z中任意字符

void fun05()
{
    char p[20];
    sscanf("agcdaDjf32DdFF","%[a-z]",p);
    printf("%s\n",p);
 }

 扩展

%[aBc]匹配a,B,c中的一员,贪婪性

%[^aFc]  匹配不是a,F,c的任意字符

%[^a-z] 匹配a-z以外的任意字符

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值