C语言入门(十六)之字符串

版权声明:如果觉得文章对你有用,转载不需要联系作者,但请注明出处 https://blog.csdn.net/jinxin70/article/details/83314438

字符串的基本概念

如何定义字符串变量, 由于字符串是同一种类型的数据组成,  并且是有序的。
而数组就是用于存储很多同一种类型的有序数据, 所以可以使用数组来保存字符串。

注意: 字符串变量和普通的字符数组有一定的区别。

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

char str1[] = "lnj";
char str2[] = {'l', 'n', 'j', '\0'};
printf("str size = %lu\n", sizeof(str1));
printf("charValues size = %lu\n", sizeof(str2));

输出长度都为4

str size = 4
charValues size = 4

如何输出字符串变量, %s。

str 数组的名称, 数组的名称就是数组的地址。

%s的原理, 从传入的"地址"开始逐个取出, 直到遇到"\0"位置。

如果定义一个如下字符数组。

char str2[] = {'x', '\0' ,'m', 'g'}; // 字符数组
printf("str = %s\n", str2);

会输出

str = x

需要明白的一点就是字符串以\0结尾, 没有\0就不是字符串;
只要是用双引号括起来的都是字符串;
字符串的本质就是数组;

char str6[] = "lnj";
str6[1] = 'y';
    
printf("%s", str6);

字符串常用方法

1、可以使用puts函数来输出

优点: 可以自动换行
缺点: 不可以自定义格式, 只能原样输出

char str[] = "lnj";
puts(str);
printf("-------\n");

2、利用scanf接收字符串的注意点

scanf接收字符串, 会以空格 , tab, 回车作为结束符号, 也就是说利用scanf接收字符串时, 字符串中不能出现空格, tab, 回车

3、利用gets接收字符串

// warning: this program uses gets(), which is unsafe.
// 如果使用gets接收字符串, 系统会提示我们正在使用一个不安全的方法接收字符
// 优点: 如果利用gets接收字符串 , 可以在字符串中输入空格, tab
printf("请输入一个字符串\n");
char buf2[10]; // lnj c
gets(buf2);
printf("buf = %s\n", buf2);

4、如何计算字符串的长度strlen

strlen的原理: 从传入的地址开始逐个取出字符串, 每取出一个就让计数器+1. 直到遇到\0为止

char str[] = "lnj cool";
size_t size =  strlen(str); // 计算出来的结果不包括\0
printf("length = %lu\n", size);//输出 length = 8

模拟strlen函数

int length = sizeof(str) / sizeof(str[0]);
int size = myStrlen2(str, length);

printf("length = %lu\n", size);

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

5、字符串拼接函数

// 原理 : 首先遍历第一个字符串,直到遇到\0为止, 然后取出第二个字符串中的字符, 从\0的位置开始添加, 添加完毕之后再在最后添加一个\0
     
    char str1[7] = "lnj"; // l n j c o o l \0
    char str2[10] = " cool";
    printf("拼接前: %s\n", str1);
    // dest : 目标 src : 源
    // 将src中的数据拼接到dest后面
    // 注意: 要想使用字符串拼接函数, 那么dest必须是一个数组, 并且数组的长度必须大于拼接之后的长度 \
    如果dest数组的长度, 不能完全存放dest+src+\0, 那么就会报错
//    strcat(str1, str2);
    
    // char * 相当于dest  const char * 相当于src size_t 需要拼接的个数
    // 为了避免拼接之后超出str1的存储范围, 那么可以动态计算str2中需要拷贝几个到str1后面不会超出
//                  str1能够存放的元素个数            -   str1已经存放的个数  - \0
//计算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);

6、字符串拷贝函数strcpy

    char str1[4] = "lnj";
    char str2[] = "cool";
    printf("拷贝前 : str1 = %s\n", str1);
    // char * 目标, const char * 源
    // strcpy函数会将源的数据拷贝到目标中, 并且会覆盖掉目标中原有的数据
    // 目标的容积必须能够存放拷贝的数据, 如果容积不够会报错
//    strcpy(str1, str2);
    
    // char * 目标, const char * 源 size_t 需要拷贝几个
    // 注意: 拷贝操作是逐个替换, 拷贝了几个就替换几个
    //              str1能够存放元素的个数         - 1是给\0留出位置
    int length = sizeof(str1) / sizeof(str1[0]) - 1;
    strncpy(str1, str2, length);
    printf("拷贝后 : str1 = %s\n", str1);

7、字符串比较函数strcmp

    char str1[] = "aac"; // a a
    char str2[] = "abc"; // a b

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

字符串练习

// 编写一个函数char_contains(char str[],char key), 如果字符串str中包含字符key则返回数值1,否则返回数值0
// 给你一个字符串和一个key, 要求从字符串中找出key, 如果找到就返回1没有找到就返回0

char str[] = "xiaomage";
char key = 'z';

int res = char_contains2(str, key);
printf("res = %i\n", res);

int char_contains2(char str[],char key)
{
     // 1.定义一个变量记录当前的索引
     //    int index = 0;
     // 2.遍历数组, 取出当前的字符判断是否不等于key, 并且当前出去的字符不是\0

    int index = -1;
    while (str[++index] != key && str[index] != '\0');
    return str[index] != '\0' ? 1 : 0;
}

字符串数组

#include <stdio.h>

int main(int argc, const char * argv[]) {
    
    char name1[] = "lnj";
    char name2[] = "lmj";
    char name3[] = "xb";
    char name4[] = "lk";
    
    // 如果想存储一堆字符串那么可以使用字符串数组
    // 说白了字符串数组就是二维数组
    char names[5][20] =
    {
        "lnj",
        "lmj",
        "xb",
        "lk",
        "xj"
    }
    
    char names2[2][20] =
    {
        {'l', 'n', 'j', '\0'},
        {'l', 'm', 'j', '\0'}
    }
    
    return 0;
}

猜你喜欢

转载自blog.csdn.net/jinxin70/article/details/83314438