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;
}

原文地址:https://www.cnblogs.com/shanshan-test/p/13033865.html