首页 > 其他分享 >11_字符串操作函数

11_字符串操作函数

时间:2023-08-05 23:45:05浏览次数:37  
标签:11 const 函数 int char str 字符串 include

字符串操作函数

以str开头的函数 都是字符串操作函数 都是遇到 '\0' 结束操作

strlen 测量字符串长度

#include<string.h>
size_t strlen(const char *s);
s: 需要测量字符串的首元素地址
char str[128]="hello";
strlen(str); //5

strcpy 字符串拷贝函数

#include <string.h>
char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, size_t n);
src 拷贝到 dest
n: src要拷贝的字符数
返回值: dest首地址

image-20230801164133290

strcat 字符串追加函数

#include <string.h>
char *strcat(char *dest, const char *src);
char *strncat(char *dest, const char *src, size_t n);
src 追加到 dest 后面
n: 要追加的src的字符数
返回值: dest 首地址

image-20230801164912769

strcmp 字符串比较

#include <string.h>
int strcmp(const char *s1, const char *s2);
int strncmp(const char *s1, const char *s2, size_t n);
返回值: >0 s1>s2
  		 <0 s1<s2
  		 =0 s1=s2

strchr 字符查找函数

#include <string.h>
char *strchr(const char *s, int c);
char *strrchr(const char *s, int c);
strchr 第一次出现c的地址, 如果没找到 返回 NULL
strrchr 最后一次出现c的地址, 如果没找到 返回 NULL

image-20230801230342815

strstr 字符串查找

#include <string.h>
char *strstr(const char *haystack, const char *needle);
返回第一次找到needle的首地址, 没找到返回 NULL

image-20230801231551155

字符串转数值

#include <stdlib.h>
atoi: 将字符串转成 int
"100" ===> 100
"sdj125df" ===> 0
"123sdlkfj651" ===> 123
atoi: 将字符串转成long
atof: 将字符串转成float

image-20230802001244554

strtok 字符串切割

#include <string.h>
char *strtok(char *str, const char *delim);
str按delim进行切割
delim: ";:#", 将按照';', ':', '#'单独分割, 不分顺序
第一次切: 用strtok(str, delim); 切成功返回首地址,否则返回NULL
后续切: 第一次切不为NULL, 用strtok(NULL, delim); 切成功返回首
地址,否则返回NULL
//不能char *str = "sdfjlk:sdjfhj"; 字符常量区':'不能替换成'\0'
    char str[] = "sdfjlk:sdjfhj:ksjdhuio:sdjhf:jkncvk:sdfu";
    char *buff[32] = {0}; //存放子串首地址

    //第一次切
    int i = 0;
    buff[i] = strtok(str, ":");

    //后续切
    while (buff[i] != NULL)
    {
        i++;
        buff[i] = strtok(NULL, ":");
    }

    for (int i = 0; buff[i] != NULL; i++)
    {
        printf("%s ", buff[i]);
    }
    printf("\n");

格式化字符串

组包: 按照需要的格式 组成字符串

解包: 解析特定格式的数据

sprintf 用于组包

#include <stdio.h>
int sprintf(char *str, const char *format, ...);
类似于: printf(const char *format, ...); 只是没有 char *str
str: 组包存放位置
返回值: 实际组包长度

image-20230803151050739

image-20230803151215509

sscanf 解包

#include <stdio.h>
int sscanf(const char *str, const char *format, ...);
str: 源数据
format: 解析格式
...: 解析到哪里

image-20230803152113603

%d提取数值 '0' ~ '9'

%s提取字符串 遇到 '\0' 空格 回车 换行 结束

sscanf 高级用法

跳过数据

//跳过数据 %*d %*s
sscanf("1234 5678", "%*d %s", buf); //buf="5678"

%[width]d %[width]s 读取指定宽度的数据

image-20230803234127825

%[aBc] 匹配aBc中的一个

image-20230804171131261

注意: 如果第一个字符匹配, 第二个字符不匹配就结束

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

image-20230804170655564

%[a-z,A-Z] 匹配a-z, A-Zimage-20230804170816041

%[ ^aFc ] 匹配aFc的任意字符

image-20230805150001351

image-20230805150718540

例子: 提取信息

char buf[] = "+CMGR:REC UNREAD,+861346630259,98/10/01,18:22:11+00,ABCdefGHI";
    char *msg[32] = {buf};

    int i=0;
    while ((msg[i] = strtok(msg[i], ",")) && ++i);

    //短信状态读取
    char status[128] = "";
    sscanf(msg[0], "%*s %s", status);
    if (strcmp(status, "UNREAD") == 0)
    {
        printf("有未读消息\n");
    }
    else if (strcmp(status, "READ") == 0)
    {
        printf("已读消息\n");
    }
    
    //获取电话
    printf("电话: %s\n", msg[1] + 3);

    //日期
    int year = 0;
    int month = 0;
    int day = 0;
    sscanf(msg[2], "%d/%d/%d", &year, &month, &day);
    printf("日期: %02d年%02d月%02d日\n", year + 1900, month, day);
    
    //时间
    int h = 0;
    int m = 0;
    int s = 0;
    sscanf(msg[3], "%d:%d:%d", &h, &m, &s);
    printf("时间: %02d时%02d分%02d秒\n", h, m, s);

    //消息
    printf("消息: %s\n", msg[4]);

image-20230805153830361

const

const修饰普通变量为只读变量

//num为只读,只能初始化,不能赋值
const int num = 10;
num = 100; //报错
printf("%d\n", num);

const修饰*

int num = 10;
const int *p = &num;
*p: 只读
num: 可读可写
p: 可读可写

const既修饰*也修饰指针变量

const int * const p = &num;
第一个const: 修饰*
第二个const: 修饰p
*p: 只读
p: 只读
num: 可读可写

标签:11,const,函数,int,char,str,字符串,include
From: https://www.cnblogs.com/mzx233/p/17608866.html

相关文章

  • C++_函数模板
    函数模板》是不进行编译的,因为类型还不知道模板的实例化》函数调用点进行实例化:在函数调用点,编译器用用户指定的类型,从原模板实例化一份函数代码出来模板函数》才是要被编译器所编译的模板类型参数typename/class模板非类型参数模板的实参推演》可以根据用户传......
  • Unity 编辑器选择器工具类Selection 常用函数和用法
    Unity编辑器选择器工具类Selection常用函数和用法点击封面跳转下载页面简介在Unity中,Selection类是一个非常有用的工具类,它提供了许多函数和属性,用于操作和管理编辑器中的选择对象。本文将介绍Selection类的常用函数和用法,并提供相应的示例代码。静态属性1.activeConte......
  • 构造函数,移动语义move与右值引用
    构造函数C++的构造函数包含一般构造函数,拷贝构造函数与移动构造函数。拷贝构造函数其中包含浅拷贝和深拷贝(此处以深拷贝为例),主要是通过将已存在的对象的所有成员拷贝给新对象,来实现对新对象的初始化。这样就会存在两个一样的对象,相当于内存中存在两份。拷贝构造函数的参数......
  • 最完美WIN11_Pro_22H2.22631.2129软件选装纯净版VIP51.3
    【系统简介】=============================================================1.本次更新母盘来自UUP_WIN11_Pro_22H2.22631.2129。进一步精简优化调整。2.只为呈现最好的作品,手工精简优化部分较多。3.OS版本号为22631.2129。个别要求高的就下MSDN吧,里面啥功能都有。4.集成《DrvCeo......
  • 11python日志类的简单应用
    代码如下:importlogging#日志类简单应用,方便规范格式化输出日志deft():foriinrange(10):logging.info("print%s",i)logging.error('发送错误')if__name__=='__main__':logging.basicConfig(level=logging.INFO,format='%(......
  • 2023年11月高项考试又要来临了。
    软考的11月的信息系统项目管理师马军和江山的资料如下:2023年11月高项VIP汇总地址-JS 链接:https://pan.quark.cn/s/e51af70c3f652023年11月高项-MJ 链接:https://pan.quark.cn/s/b48950ace027 qq:6648448,qq群:74839752......
  • 浅谈非栈上格式化字符串
    浅谈非栈上格式化字符串这里先浅分析修改返回地址的两种打法,分别是"诸葛连弩"和”四马分肥“修改返回地址本文例题以陕西省赛easy_printf为主简单看一看程序需要先过一个判断然后进入vuln进入后有一个13次的循环可以让我们操作第一步肯定要先leak出栈地址程序......
  • bevy 0.11 camera2d zoom and pan with touchpad on macos
    usebevy::prelude::*;usebevy::{input::mouse::MouseWheel,render::camera::ScalingMode};usebevy::input::touchpad::TouchpadMagnify;usebevy::window::PrimaryWindow;constGRID_SIZE:usize=200;pubstructSimpleCameraPlugin;implPluginforSimpleCam......
  • T1173 阶乘和
    T1173阶乘和题目传送门首先,题目里说了高精度,那还想什么?这里介绍一个有亿点点难懂的方法上课!第一步首先,先建立一个结构体来模拟大整数类。结构体不仅可以包含成员变量,还能定义成员函数。代码如下:#definemaxn100structBigint{intlen,a[maxn];//为了兼顾效率和复......
  • C++可重入函数和不可重入函数
    转载:https://blog.csdn.net/weixin_41969690/article/details/108006834C++可重入函数和不可重入函数可重入函数是指能够被多个线程“同时”调用的函数,并且能保证函数结果正确不必担心数据错误的函数。不可重入函数是指不能运行在多任务环境下,除非能保证互斥的函数。由于使用......