C语言--字符串

时间:2022-08-16 00:23:27

字符串

  • 如何定义字符串变量, 由于字符串是同一种类型的数据组成, 并且是有序的\而数组就是用于存储很多同一种类型的有序数据, 所以可以使用数组来保存字符串.
  • 注意: 字符串变量和普通的字符数组有一定的区别.C语言规定, 字符串必须以\0结尾(作为字符串的结束符号),所以字符串变量的元素个数比字符数组的元素个数多一个 \0.
 char str[] = "lnj"; // 字符串变量 l n j \0
 printf("str size = %lu\n", sizeof(str));
 //字符数组 , 这个并不是字符串, 而是字符数组
 char charValues[] = {'l', 'n', 'j'};
 // 如何输出字符串变量, %s
 // str 数组的名称, 数组的名称就是数组的地址
 // %s的原理, 从传入的"地址"开始逐个取出, 直到遇到"\0"位置
 printf("str = %s\n", str);
 // 部分初始化中, 没有被初始化的元素默认是0
 // \0对应的ASCII 0
 char str3[10] =  {'l', 'n', 'j'}; // l n j 0000000 字符串
 char str4[3] = {'l', 'n', 'j'}; // 该方式不是字符串, 而是字符数组, 因为没有\0
  • 需要明白的一点就是字符串以\0结尾, 没有\0就不是字符串;
  • 只要是用双引号括起来的都是字符串;
  • 字符串的本质就是数组.

输出的字符串的方法

  • 可以使用printf的%s占位符来输出:
  • 弊端 : 如果想要换行, 必须加上\n;
  • 优点 : 可以自定义格式化需要输出的字符串,也就是可以按照我们需要的格式来输出
char str[] = "cxw";
printf("name = %s!!!!\n", str);
printf("-------\n");
  • 可以使用puts函数来输出:
  • 优点: 可以自动换行;
  • 缺点: 不可以自定义格式, 只能原样输出.
puts(str);

如何输入字符

  • 利用scanf接收字符串:
  • 注意点:scanf接收字符串,会以空格,tab,回车作为结束符号,也就是说利用scanf接收字符串时, 字符串中不能出现空格, tab, 回车;
printf("请输入一个字符串\n");
char buf[10];
scanf("%s", buf);
printf("buf = %s\n", buf);
printf("-------\n");
  • 利用gets接收字符串:
  • 如果使用gets接收字符串,系统会提示我们正在使用一个不安全的方法接收字符;
  • 优点: 如果利用gets接收字符串 , 可以在字符串中输入空格, tab;
 printf("请输入一个字符串\n");
 char buf2[10];
 gets(buf2);
 printf("buf = %s\n", buf2);

如何计算字符串的长度

  • strlen计算长度的原理:从传入的地址开始逐个取出字符串, 每取出一个就让计数器+1. 直到遇到\0为止;
        strlen(str); // 计算出来的结果不包括\0
        // 自定义一个strlen函数
        int myStrlen(char str[])
        {
           // 1.定义变量记录取出了多少个字符
            int count = 0;
          // 2.遍历字符数组
            while (str[count] != '\0') {
                count++; // 1 2 3
            }
            return count;
        }
        int myStrlen2(char str[], int length)
        {
            // 1.定义变量记录取出了多少个字符
            int count = 0;
            // 2.遍历字符数组
            for (int i = 0; i < length; i++) {
                if (str[i] != '\0') {
                    count++;
                }
            }
            return count;
        }

字符串拼接

  • strcat(dest, src);dest:目标src:源.将src中的数据拼接到dest后面;
  • 注意: 要想使用字符串拼接函数, 那么dest必须是一个数组, 并且数组的长度必须大于拼接之后的长度;如果dest数组的长度, 不能完全存放dest+src+\0, 那么就会报错;
//为了避免拼接之后超出str1的存储范围,那么可以动态计算str2中需要拷贝几个到str1后面不会超出.
size_t length = sizeof(str1) / sizeof(str1[0]) - strlen(str1) - 1;
printf("length = %lu\n", length);
strncat(str1, str2, length);
printf("拼接后: %s\n", str1);

字符串拷贝

  • strcpy(str1, str2);strcpy函数会将源的数据拷贝到目标中, 并且会覆盖掉目标中原有的数据,目标的容积必须能够存放拷贝的数据, 如果容积不够会报错.
  • 注意: 拷贝操作是逐个替换, 拷贝了几个就替换几个.
//动态计算能够拷贝的长度.
int length = sizeof(str1) / sizeof(str1[0]) - 1;
strncpy(str1, str2, length);
printf("拷贝后 : str1 = %s\n", str1);

字符串比较

  • strcmp(str1,str2);它会对传入的字符串进行比较,比较完毕之后会返回一个整型的值;
  • strcmp的原理: 取出字符串中的每一个字符进行逐个比较,如果发现不相等就不会继续往下比较;
    • 如果该值等于0,那么证明两个字符串相等;
    • 如果该值小于0, 那么证明str1小于str2;
    • 如果该值大于0, 那么证明str1大于str2;

字符串数组

    // 如果想存储一堆字符串那么可以使用字符串数组
    // 说白了字符串数组就是二维数组
    char names[5][20] =
    {
        "cxw",
        "are",
        "we",
        "me",
        "here"
    }
    char names2[2][20] =
    {
        {'h', 'e', 'r', '\0'},
        {'h', 'i', 's', '\0'}
    }