• C风格字符串


    image

    C风格字符串

    关于C风格字符串的问题

    ❓C++有string为什么还要学习C风格字符串?

    1. 某些场景使用C风格字符串更方便、更高效
    2. C标准库、Linux库 、开源库和数据库的接口函数,一定有C语言但不一定有C++(MySQL的接口函数只有C而没有C++)
    3. String是类,封装了C风格字符串(学习C风格字符串能帮助理解String类)

    C中字符数组与字符串的区别

    C中字符串的末尾会有**'/0' ​**,而字符数组没有

    char name[21]; 	//字符串,最多存放20个英文字符或10个中文字符,最后一个字符为 ' /0 ' 
    

    C风格字符串的使用

    字符串的初始化

    char name[11];			//未初始化,其值为垃圾直
    char name[11] = "Hello";	//初始化为Hello,系统自动在末尾添加'/0'
    char name[11] = {"Hello"}; //初始化为Hello,系统自动在末尾添加'/0'
    char name[] = {"Hello"};	//初始化为Hello,系统自动在末尾添加'/0'
    char name[11]   {"Hello"};	//初始化为Hello,系统自动在末尾添加'/0'(C++ 11 标准)
    char name[11] = {0};		//全部元素初始化为0
    

    清空字符串

    使用memset()​函数清空字符串

    语法:memset(字符数组的首地址即数组名,0,数组内存的空间大小)

    char name[10];
    memset(name,0,sizeof(name));
    //结果
    0 0 0 0 0 0 0 0 0 0 
    

    字符串复制或赋值

    ❗C语言字符串不能用" = "赋值

    strcpy()函数

    语法:strcpy(目标字符串,源字符串)

    返回值:返回目标字符串的首地址

    ⚠复制完字符串后,会自动在目标字符串后面追加' /0 '

     如果目标字符串所指向的内存不够大,则会导致数组越界
    
    char name[11] = {"Hello"};
    char namecpy[11];
    strcpy(namecpy,name);
    //结果
    namecpy[11]——>Hello
    

    strncpy()函数

    语法:strncpy(目标字符串,源字符串,n个字符)

    返回值:返回目标字符串的首地址

    ⚠如果源字符串小于n,则拷贝完后会在目标字符串后追加' /0 '

     如果源字符串大于或等于n,则截取前n个字符,且不会再目标字符串后追加' /0 '
    如果目标字符串所指向的内存不够大,则会导致数组越界
    
    

    char name[11] = {"Hello"};
    char namecpy[11];
    strcpy(namecpy,name,3);
    //结果
    namecpy[11]——>Hel
    

    字符串长度

    语法:strlen(字符串的首地址即字符串名)

    char name [11] = { "Hello" };
    cout << strlen(name) << endl;
    //输出结果
    5		//检索到'/0'时结束
    

    字符串拼接

    strcat()函数

    语法:strcat(目标字符串,源字符串) ​​==目标字符串原有的'/0'会被覆盖掉==

    char firstname[10] = {"Hello"};
    char lastname[10] = {" World"};
    strcat(firstname,lastname);
    //运行结果
    Hello World
    

    strncat()函数

    语法:strcat(目标字符串,源字符串,n个字符) ​​==目标字符串原有的'/0'会被覆盖掉==

    char firstname[10] = {"Hello"};
    char lastname[10] = {" World"};
    strcat(firstname,lastname,2);
    //运行结果
    Hello Wo
    

    字符串比较

    目标字符串与源字符串(或源字符串前n个字符)比较 返回值
    > 1(ASCII码的差)
    = 0
    < -1(ASCII码的差)

    strcmp()函数

    语法:strcmp(目标字符串,源字符串)

    char name1[10] = {"Hello"};
    char name2[10] = {"hello"};
    strcmp(name1,name2);
    //运行结果
    -32
    

    strncmp()函数

    语法:strcmp(目标字符串,源字符串,前n个字符)

    char name1[10] = {"Hello"};
    char name2[10] = {"hello"};
    strcmp(name1,name2,3);
    //运行结果
    -32
    

    字符查找

    strchr(字符串,要查找的字符) 【是从一个字符串str中第一次出现该字符character的位置】

    strrchr(字符串,要查找的字符)【是从一个字符串str中最后一次出现该字符character的位置】

    返回值:如果在字符串 str 中找到字符 c,则函数返回指向该字符的指针,存在和首地址相减,可以得到下标。如果未找到该字符则返回 NULL。

    字符串查找

    语法:strstr(字符串,子串)

    返回值:返回子串在字符串中第一次出现的地址,没有返回0

    ⚠C风格字符串的注意事项

    5⃣在VS中使用C风格字符串是应加上#define _CRT_SECURE_NO_WARNINGS

    1⃣字符串的结尾标志为'/0',在处理时会从起始位置开始搜索直到搜索到'/0'为止

    不会判断数组越界的原因:

    操作字符串的函数形参为指针,只存放了字符串的起始地址,没有字符串的长度参数,无法判断是否越界

    2⃣结尾标识符'/0'后面都是垃圾值

    3⃣字符串在每次使用前都要初始化

    4⃣不要再子函数里面使用sizeof运算符(因为子函数中的参数为指针,总是占8字节(64位操作系统))

  • 相关阅读:
    2小时开发《点球射门游戏》,动画演示思路(上),代码已开源
    线代 | 【提神醒脑】自用笔记串联二 —— 向量组 · 线性方程组 · 特征值与特征向量
    IP分片、TCP分段
    论文解读(LA-GNN)《Local Augmentation for Graph Neural Networks》
    【torch.nn.init】初始化参数方法解读
    FPGA之旅设计99例之第十一例-----OLED显示字符
    KeeWiDB 的架构由代理层和服务层两个部分构成
    激光雷达战场越来越激烈了
    mysql查询条件字段值末尾有空格也能查到数据问题
    15Spring Boot整合MyBatis
  • 原文地址:https://www.cnblogs.com/huajianyizou/p/c-style-string-28qs0e.html