字符串操作

时间:2024-11-25 12:18:10

知识点【字符串操作】

以str开头 遇到'\0'结束

1、strlen测字符串长度函数

#include <string.h>
size_t strlen(const char *s);
功能:测量s指向字符串的有效字符数量(遇到'\0'结束统计 不包含'\0')
参数:
    s:字符串的起始地址
返回值:为测量的字节数

#include <string.h>
void test01()
{
    printf("%lu\n", strlen("hello world"));//11
    printf("%lu\n", strlen("hello\0world"));//5
    printf("%lu\n", strlen("\123456\\x78\79\x12345hello"));//16
    return;
}

2、字符串拷贝函数

strcpy strncpy

#include <string.h>
char *strcpy(char *dest, const char *src);
功能:将src指向的字符串 拷贝到 dest指向空间
注意:
    dest执行的空间必须可读可写
返回值:返回值dest指向的空间起始地址
    意义是完成链式操作。
    
                                         
char *strncpy(char *dest, const char *src, size_t n);
功能:只拷贝src的前n字节到dest指向空间中

案例1:以下代码的问题

char *dst="hello world";
strcpy(dst,"hello");//段错误 dst指向的文字常量区不允许被赋值

案例2:strcpy返回值的意义

字符串操作_字符串操作函数

案例3:strncpy

字符串操作_字符串操作函数_02

字符串操作_i++_03

案例4:以下代码问题

char name[32]="";
name="lucy";//error name为数组名 不能被赋值 必须使用strcpy(name,"lucy")

3、字符串追加函数

#include <string.h>
char *strcat(char *dest, const char *src);
功能:将src指向字符串 追加到 dest指向的字符串末尾(第一个'\0'的位置)
char *strncat(char *dest, const char *src, size_t n);
功能:将src指向字符串的前n个字节 追加到 dest指向的字符串末尾(第一个'\0'的位置)

字符串操作_字符串操作函数_04

4、strcmp/strncmp 函数

#include <string.h>
int strcmp(const char *s1, const char *s2);
功能:比较s1和s2指向的两个字符串的大小
返回值:
    相等 返回0
    大于 返回>0
    小于 返回<0
int strncmp(const char *s1, const char *s2, size_t n);
功能:比较s1和s2指向的两个字符串前n个字节的大小
返回值:
    相等 返回0
    大于 返回>0
    小于 返回<0

void test05()
{
    char str1[]="hello world";
    char str2[]="hello";

    if(strcmp(str1,str2) == 0)
    {
        printf("%s等于%s\n",str1,str2);
    }
    else if(strcmp(str1,str2)>0)
    {
        printf("%s大于%s\n",str1,str2);
    }
    else if(strcmp(str1,str2)<0)
    {
        printf("%s小于%s\n",str1,str2);
    }

    if(strncmp(str1,str2,5) == 0)
    {
        printf("%s等于%s\n",str1,str2);
    }
    else if(strncmp(str1,str2,5)>0)
    {
        printf("%s大于%s\n",str1,str2);
    }
    else if(strncmp(str1,str2,5)<0)
    {
        printf("%s小于%s\n",str1,str2);
    }
}

字符串操作_字符串_05

5、字符查找函数

 #include <string.h>
 char *strchr(const char *s, int c);
 功能:从s指向的字符串中 查找第一次出现的字符c的地址(失败返回NULL)
 char *strrchr(const char *s, int c);
 功能:从s指向的字符串逆序查找第一次出现的字符c的地址(失败返回NULL)

字符串操作_字符串_06

6、字符串匹配函数

 #include <string.h>

char *strstr(const char *haystack, const char *needle);
功能:从haystack指向的字符串中 查找第一次出现needle指向的字符串的地址

字符串操作_字符串操作函数_07

7、memset函数

 #include <string.h>

void *memset(void *s, int c, size_t n);
 功能:从s地址开始填充n个字节的字符c
 主要用去清空内存:
 char *p=(char *)malloc(128);//malloc申请的堆区空间默认内容不确定
 //清空内存
 memset(p,0,128);//将p指向堆区空间中128个字节分别填充为0

字符串操作_i++_08

8、memcpy内存拷贝

 #include <string.h>

void *memcpy(void *dest, const void *src, size_t n);
 功能:将src指向的空间的n字节 拷贝到dest指向的空间中

字符串操作_i++_09

9、字符串切割函数

字符串:"hehehe:xixixixi:hahaahaha:heiheiheihei:lalalala"

 #include <string.h>

char *strtok(char *str, const char *delim);
 功能:将str指向的字符串 安装delim指向的切割符号 进行字符串切割
 返回值:
     成功返回 切割到的子串的首元素地址
     失败:返回NULL
 注意:
     1、strtok调用一次只能切割一个字符串
     2、第一次调用strtok时候 str必须指向被切割的字符串
     3、后续的切割 str必须传NULL
     4、str指向空间 必须可读可写

切割一式:

#include <stdio.h>
#include <string.h>
void test01()
{
    char str[] = "hehehe::::::xixixixi#hahaahaha!heiheiheihei:lalalala";
    char *arr[32] = {NULL};

    // 第一次:切割字符串
    int i = 0;
    arr[i] = strtok(str, ":#!");

    // 以后次数(前一次切割正常 才能进行下一次切割)
    while (arr[i] != NULL) // 前一次切割正常
    {
        i++;
        arr[i] = strtok(NULL, ":#!");
    }

    //遍历字串
    i=0;
    while(arr[i])
    {
        printf("%s\n",arr[i++]);
    }

}

切割二式:

#include <string.h>
void test01()
{
    char str[] = "hehehe::::::xixixixi#hahaahaha!heiheiheihei:lalalala";
    char *arr[32] = {str};

    // 第一次:切割字符串
    int i = 0;
    // 以后次数(前一次切割正常 才能进行下一次切割)
    while (arr[i] = strtok(arr[i], ":#!")) // 前一次切割正常
    {
        i++;
    }

    //遍历字串
    i=0;
    while(arr[i])
    {
        printf("%s\n",arr[i++]);
    }

切割三式:

#include <string.h>
void test01()
{
    char str[] = "hehehe::::::xixixixi#hahaahaha!heiheiheihei:lalalala";
    char *arr[32] = {str};

    // 第一次:切割字符串
    int i = 0;
    // 以后次数(前一次切割正常 才能进行下一次切割)
    while ((arr[i] = strtok(arr[i], ":#!")) && ++i);

    //遍历字串
    i=0;
    while(arr[i])
    {
        printf("%s\n",arr[i++]);
    }

}