• 字符串


    1. 字符串概念以及基本操作

    字符串是以0或者'\0'结尾的字符数组,(数字0和字符'\0'等价),字符数组只能初始化5个字符,当输出的时候,从开始位置直到找到0结束

    字符数组部分初始化,剩余填0

    如果以字符串初始化,那么编译器默认会在字符串尾部添加'\0'

    说明:

    sizeof计算数组大小,数组包含'\0'字符

    strlen计算字符串的长度,到'\0'结束

    示例代码:

    //字符串基本操作

    //字符串是以0或者'\0'结尾的字符数组,(数字0和字符'\0'等价)

    void test01(){

    //字符数组只能初始化5个字符,当输出的时候,从开始位置直到找到0结束

    char str1[] = { 'h', 'e', 'l', 'l', 'o' };出现乱码!因为找不到\0

    printf("%s\n",str1);

    //字符数组部分初始化,剩余填0

    char str2[100] = { 'h', 'e', 'l', 'l', 'o' };不会出现乱码,因为其余位置自动补0

    printf("%s\n", str2);

    //如果以字符串初始化,那么编译器默认会在字符串尾部添加'\0'

    char str3[] = "hello";自带\0

    printf("%s\n",str3);

    printf("sizeof str:%d\n",sizeof(str3));6

    printf("strlen str:%d\n",strlen(str3));5

    //sizeof计算数组大小,数组包含'\0'字符

    //strlen计算字符串的长度,到'\0'结束

    //那么如果我这么写,结果是多少呢?

    char str4[100] = "hello";

    printf("sizeof str:%d\n", sizeof(str4));100

    printf("strlen str:%d\n", strlen(str4));5

    //请问下面输入结果是多少?sizeof结果是多少?strlen结果是多少?

    char str5[] = "hello\0world"; 

    printf("%s\n",str5);hello

    printf("sizeof str5:%d\n",sizeof(str5));12

    printf("strlen str5:%d\n",strlen(str5));5

    //再请问下面输入结果是多少?sizeof结果是多少?strlen结果是多少?

    char str6[] = "hello\012world";\012算一个

    printf("%s\n", str6);hello 换行 world

    printf("sizeof str6:%d\n", sizeof(str6));12

    printf("strlen str6:%d\n", strlen(str6));11

    }

    八进制和十六进制转义字符:

         在C中有两种特殊的字符,八进制转义字符和十六进制转义字符,八进制字符的一般形式是'\ddd',d是0-7的数字。十六进制字符的一般形式是'\xhh',h是0-9或A-F内的一个。八进制字符和十六进制字符表示的是字符的ASCII码对应的数值。转为10进制对于ascll表字符

    比如 :

    1. '\063'表示的是字符'3',因为'3'的ASCII码是30(十六进制),48(十进制),63(八进制)。
    2. '\x41'表示的是字符'A',因为'A'的ASCII码是41(十六进制),65(十进制),101(八进制)。

     

    2.字符串拷贝功能实现操作

    前提都要先初始化一下,不要是野指针

    //拷贝方法1---利用数组下标拷贝(其实也是指针)函数内的数组下标相当于*(p+i)

    void copy_string01(char* dest, char* source ){//将内存一个个取出来,放入另一个,到结束符为止

    for (int i = 0; source[i] != '\0';i++){

    dest[i] = source[i];

    }

    }

    //拷贝方法2---利用指针进行拷贝

    void copy_string02(char* dest, char* source){

    while (*source != '\0' /* *source != 0 */){遍历一整个字符串,俩个首地址一个个按步长增加,然后赋值

    *dest = *source;

    source++;

    dest++;

    }

    }

    //拷贝方法3(较难)

    void copy_string03(char* dest, char* source){

    //判断*dest是否为0,0则退出循环

    while (*dest++ = *source++){}

    }

     

    3. 字符串反转模型操作

     

    方法1:利用下标的方法

    void reverse_string(char* str){

    if (str == NULL){

    return;

    }

    int begin = 0;

    int end = strlen(str) - 1;

    while (begin < end){判断当头坐标大于尾坐标时,不能相等,因为偶数永远不会相等

    //交换两个字符元素

    char temp = str[begin];

    str[begin] = str[end];

    str[end] = temp;

    begin++;

    end--;

    }

    }

    void test(){

    char str[] = "abcdefghijklmn";

    printf("str:%s\n", str);

    reverse_string(str);

    printf("str:%s\n", str);

    }

    方法2:利用字符串指针

     

     

     

    4.字符串的格式化

    sprintf

    #include <stdio.h>

    int sprintf(char *str, const char *format, ...);

    功能:

         根据参数format字符串来转换并格式化数据,然后将结果输出到str指定的空间中,直到    出现字符串结束符 '\0'  为止。

    参数:

    str:字符串首地址,格式化后往地址内填充字符数据类型要是开辟好的char形

    format:字符串格式,用法和printf()一样

    ...:格式化中的参数(可多位)

    返回值:

    成功:实际格式化的字符个数(strlen的结果)

    失败: - 1

    格式化类型:

    void test(){

    //1. 格式化字符串(常用)  最好不能是空指针或者是野指针

    char buf[1024] = { 0 };

    sprintf(buf, "你好,%s,欢迎加入我们!", "John");

    printf("buf:%s\n",buf);

    memset(buf, 0, 1024);

    sprintf(buf, "我今年%d岁了!", 20);

    printf("buf:%s\n", buf);

    //2. 拼接字符串

    memset(buf, 0, 1024);

    char str1[] = "hello";

    char str2[] = "world";

    int len = sprintf(buf,"%s %s",str1,str2);

    printf("buf:%s len:%d\n", buf,len);

    //3. 数字转字符串格式化输出

    memset(buf, 0, 1024);

    int num = 100;

    sprintf(buf, "%d", num);

    printf("buf:%s\n", buf);

    //设置宽度 右对齐

    memset(buf, 0, 1024);

    sprintf(buf, "%8d", num);一共宽度是8,右对齐

    printf("buf:%s\n", buf);

    //设置宽度 左对齐

    memset(buf, 0, 1024);

    sprintf(buf, "%-8d", num);

    printf("buf:%s\n", buf);

    //转成16进制字符串 小写

    memset(buf, 0, 1024);

    sprintf(buf, "0x%x", num);

    printf("buf:%s\n", buf);

    //转成8进制字符串

    memset(buf, 0, 1024);

    sprintf(buf, "0%o", num);

    printf("buf:%s\n", buf);

    }

     

     

  • 相关阅读:
    C++设计模式_05_Observer 观察者模式
    蓝桥杯2024年第十五届省赛
    处理Java异常的10个最佳实践
    lombok 基础注解
    iis站点https绑定
    【2023年11月第四版教材】第16章《采购管理》(第二部分)
    Springboot+JWT+Redis实现登陆登出功能
    Spring进阶(四):Boot
    【CesiumJS入门】(11)加载LAS点云数据
    Libgdx游戏开发(5)——碰撞反弹的简单实践
  • 原文地址:https://blog.csdn.net/weixin_46098612/article/details/125425392