zoukankan      html  css  js  c++  java
  • C语言-字符串

    如何定义字符串

    • 由于字符串是同一类型的数据组成的,并且是有序的,而数组就是用于存储同一类型的有序数据,所以可以用数组来存储字符串

    • 但是字符串变量和普通的字符数组有一定区别

      • C 语言规定字符串必须以 结尾,(作为字符串的结束符号),所以字符串变量的元素个数比字符数组的元素个数多一个

      • int main(){
            char str[] = "lnn";
            printf("字符串有多长:%i
        ",sizeof(str));
        }
        
    • 如何输出字符串变量

      • %s的原理,从传入的地址开始逐个取出,直到遇到 为止
        // %s的原理,从传入的地址开始逐个取出,直到遇到 为止
        char str1[] = "sss";
        char str2[] = {'a','b','c'};
        printf("%s
    ",str2); // abcsss
        // 内存寻址从大到小,依次y取出 a,b,c,发现还不是,此时继续取,s,s,s,,发现有 此时结束取值
    

    字符串初始化

        char str3[] = "lnn";
        char str4[] = {'a','b',''};
        char str5[10] = {'b','c','d'}; // 这种方式也是对的, 的 ASCII 码值就是 0,所以是可以的
        char str6[3] = {'b','c','d'}; // 这种就不是字符串了,因为字符串是以 结尾的
    

    修改字符串的值

        char str7[] = "abc";
        printf("字符串 str7 没有修改之前的值:%s
    ",str7);
        str7[0] = 'z';
        printf("看看字符串 str7 修改了么%s
    ",str7);
    

    如何输出字符串

    	// 如何输出字符串
        // 1,使用 printf()的%s 占位符
        // 优点:可以自定义格式输出,
        // 缺点:必须手动加上
     才能换行
        char str8[] = "abc";
        printf("%s
    ",str2);
        
        // 2,使用puts()
        // 优点:自动换行
        // 缺点:不可以自定义格式  ,只能原样输出
        puts(str8);
    

    如何输入字符串

    	// 如何输入字符串
        // 1,使用 scanf 接收
        // 注意点:scanf 函数接收字符串,是以空格,tab,回车作为结束符号,也就是 scanf接收字符串时不能出现空格,tab,回车.比如输入 lnn lnn,此时只会输出 lnn,空格后面的都接收不到了
        /*
        printf("请输入您要输入的字符串,已回车结束
    ");
        char str9[10];
        scanf("%s",str9);// 此处不用写取地址符号&,因为数组名就是数组的地址,就是数组第 o 个元素的地址
        printf("str9 = %s
    ",str9);
        */
        
        // 使用 gets接收字符串
        // warning: this program uses gets(), which is unsafe.--->指的是这是一个不安全的
        // 1,定义的一个字符串最多存储 10 个字符,如果输入的多了就会报错了
        // 2,如果输入10 个字符但是并没有,那么这还不是一个字符串,也是不安全的
        // 优点:利用 gets 可以直接输入空格,tab,回车
        /*
        printf("请输入您要输入的字符串,已回车结束
    ");
        char str10[10];
        gets(str10);
        printf("str10 = %s
    ",str10);
        */
    

    如何计算字符串的长度

    	// 如何字符串的长度
        char value[] = "wahaha,zhenhaohe";
        // int leight = sizeof(value) / sizeof(value[0]) - 1; //不包含,没啥用
        size_t leight = strlen(value); // 计算的字符串长度不包含
        printf("字符串长度:%i
    ",leight);
        for (int i=0; i < leight; i++) {
            printf("value[%i] = %c
    ",i,value[i]);
        }
        
        // strlen 的原理,从传入的地址逐个取出字符串,没取出一个就让计数器加 1,直到遇到 位置
    

    字符串的拼接

    // 字符串的拼接strcat
        char value1[10] = "lnn";
        char value2[10] = "mmm";
        strcat(value1, value2);
        printf("拼接之后的 value1 是:%s
    ",value1); // lnn mmm
        // 注意,要想使用字符串拼接函数,那么dest 必须是一个数组,并且这个数组的长度必须要大于拼接之后的长度,如果数组的长度不能完全存放拼接后的长度就会报错.
        
        // 字符串拼接 strncat char*,char*,size_t
        // size_t 就是指定要拼接几个字符
        // 如何动态计算最多可以拼接几个字符?,数组总长度-目前字符串长度
        size_t size = sizeof(value1) / sizeof(value1[0]) - strlen(value1)-1;
        printf("还能拼接%lu
    ",size);
        strncat(value1, value2, 1); // 指定拼接几个字符
        strncat(value1, value2, size); // 动态计算还能拼接几个字符
        printf("拼接之后的 value1 是:%s
    ",value1); //此时指定拼接 value2 中的一个字符
    

    字符串拷贝

    // 字符串的拷贝strcpy
        char value1[10] = "lnn";
        char value2[10] = "mmm";
        // printf("拷贝前 value1 的值:%s
    ",value1); // lnn
        // strcpy(value1, value2);
        // printf("拷贝后 value1 的值:%s
    ",value1); // mmm
        // 注意拷贝的数组不能比原数组长,否则报错
        // 字符串的拷贝 strncpy
        strncpy(value1, value2, 1);
        printf("拷贝后 value1 的值:%s
    ",value1);
        printf("拷贝后 value2 的值:%s
    ",value2);
        // 注意拷贝操作是逐个替换,我现在只拷贝了一个也就是 value2 字符串中的 m,替换掉了 value1 字符串的 l,其余的还是没有变的
        // 动态计算能拷贝几个值
        size_t size = sizeof(value1) / sizeof(value1[0]) -1; // 减去 1 是为了
        strncpy(value1, value2, size);
    

    字符串的比较

    / 字符串的比较
        char value1[10] = "lnn";
        char value2[10] = "mmm";
        // strcmp他会对传入的两个字符串进行比较,比较完毕会返回一个整数,0 表示相等,小于 0 代表第一个字符串小于第二个字符串,大于 0 表示第一个字符串大于第二个字符串
        int result = strcmp(value1, value2);
        printf("两个字符串 value1 和 value2 相比较的结果是:%i
    ",result);
        
    

    字符串数组

        // 字符串数组
        // 一个字符串是数组,要存储多个字符串,就是用二维数组
        char name1[] = "lnn";
        char name2[] = "xmg";
        char name3[] = "sss";
        char name4[] = "yf";
        // 以上存储太过麻烦,使用二维数组存储
        char names[10][10] = {
            "lnn",
            "xmg",
            "sss",
            "yf"
        };
    

    字符串练习

    int main(){
        // 练习
        // 编写一个函数char_contains(char str[],char key),如果字符串str 中包含key 则返回 1,否则返回 0
        char value3[] = "abc";
        int leigth = strlen(value3);
        char key = 'c';
        int result1 = char_contains(value3, key);
        printf("是否包含,看看结果吧:%i
    ",result1);
    }
    
    int char_contains(char str[],char key){
        unsigned long leigth = strlen(str);
        printf("看看用 strlen 在函数中打印的字符串长度:%lu
    ",leigth);
        int result = -1;
        for (int i = 0; i < leigth; i++) {
            // int result = strcmp(value3[i], key);
            printf("看看字符串的值是:%c
    ",str[i]);
            if (str[i] == key) {
                result = 1;
                break;
            }else
            {
                result = 0;
            }
        }
        return result;
    }
    
    
  • 相关阅读:
    java基础,集合,ConcurrentHashMap,JDK1.7理解
    单例的几种方式,以及如何破坏单例,使用枚举保护单例;
    测试一软件测试基础知识总结
    spring cloud gateway(三、实现限流)
    gateway(二、过滤器)
    spring cloud gateway
    spring cloud zuul网关
    进入mysql方法
    spring cloud consul 服务治理
    多模块项目之坑
  • 原文地址:https://www.cnblogs.com/shanshan-test/p/13033865.html
Copyright © 2011-2022 走看看