zoukankan      html  css  js  c++  java
  • C语言学习笔记-字符串

    • 字符串初始化
    • 访问字符串
    • 字符串的拷贝

    字符串初始化

    C 语言没有字符串类型,利用字符类型来模拟,以 结尾。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    int main()
    {
        // 如果用字符数组来初始化字符串,末尾不是结尾后面的会乱码
        char buf[] = {'a', 'b', 'c'};
        printf("buf = %s
    ", buf);
        // 指定数组长度未初始化的地方会补零,读到0就作为字符串结束标记,则不会乱码
        char buf1[100] = {'a', 'b', 'c'};
        printf("buf1 = %s
    ", buf1);
        // '字符 0' ≠ 0 = ''
        char buf2[100] = {'a', 'b', 'c', '0', '1', '2'};
        printf("buf2 = %s
    ", buf2);
        char buf3[100] = {'a', 'b', 'c', 0, '1', '2'};
        printf("buf3 = %s
    ", buf3);
        char buf4[100] = {'a', 'b', 'c', '', '1', '2'};
        printf("buf4 = %s
    ", buf4);
        // 常用初始化字符串的方法
        char str[] = "safafasga";
        // strlen() 和 sizeof() 的区别:
        // 字符串末尾以结尾,strlen() 计算字符串长短; sizeof()计算大小还会包含
        printf("strlen() = %d, sizeof() = %d
    ", strlen(str), sizeof(str));
        char str2[100] = "safafasga";
        // 制定数组大小的情况下,未制定的位置将会自动补零
        printf("strlen() = %d, sizeof() = %d
    ", strlen(str2), sizeof(str2));
        return 0;
    }
    

    访问字符串

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    
    #include <stdio.h>
    #include <string.h>
    /**
    * 遍历字符串的方法
    **/
    int main()
    {
        char *buf = "fdsafasdgag";
        for(int i = 0; i < strlen(buf); ++i)
        {
            printf("%c", buf[i]);
        }
        printf("
    ");
        char *p = buf;
        for(int i = 0; i < strlen(buf); i++)
        {
            printf("%c", p[i]);
        }
        printf("
    ");
        for(int i = 0; i < strlen(buf); i++)
        {
            printf("%c", *(p + i));
        }
        printf("
    ");
        for(int i = 0; i < strlen(buf); i++)
        {
            printf("%c", *(buf + i));
        }
        printf("
    ");
        // p 和 buf 等价么
        // buf 是常量,常量是不可变的
        // p 是变量,可变
        // p++;
        // buf++; // err
        return 0;
    }
    

    字符串的拷贝

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    
    #include <stdio.h>
    #include <string.h>
    /**
    * 1. 进行非空判断,避免异常
    * 2. 不要直接使用形参
    **/
    int my_strcpy(char *dst, char *src)
    {
        // 非空判断
        if(dst == NULL || src == NULL)
            return -1;
        // 不要直接使用形参
        // 会改变数组的首地址位置
        char *to = dst;
        char *from = src;
        while(*to++ == *from++);
        
        // 上面把形参结果来不起作用,只有这样才行,之后再看一下
        // while(*dst++ == *src++);
        return 0;
    }
    /**
    * 1. 实现字符串拷贝函数
    * 2. 写出健壮的代码的注意事项
    **/
    int main()
    {
        char *src = "dfagfadga";
        char dst[100] = {0};
        int res = my_strcpy(dst, src);
        if(res != 0)
        {
            fprintf(stderr,"copy str error.");
            return -1;
        }
        printf("dst: %s
    ", dst);
        return 0;
    }
    
  • 相关阅读:
    性能测试中的二八原则
    OS + Linux Shell Programme / 100 cases
    db postgres openGauss
    OS + Linux sshkeygen / sshcopyid / id_rsa / id_rsa.pub / authorized_keys
    OS + Android performance matrix / memory LeakCanary
    springBoot 使用ConfigurationProperties+PropertySource注解 引入yml配置文件
    SpringBoot2.0集成WebSocket,实现后台向前端推送信息
    springBoot + rabbitMQ +手动确认消息 + 控制(接口、定时任务)消费者上下线
    linux 环境下安装keepalived 并且进行简单的主备配置
    eureka 注册列表低延迟注册、剔除服务配置 实现8s延迟
  • 原文地址:https://www.cnblogs.com/shuiyj/p/13185156.html
Copyright © 2011-2022 走看看