C语言笔记12

191 阅读3分钟

字符串处理函数

需要加头文件 #include<string.h>

strlen 长度

  • 测量从第一个元素到元素值为'\0'字符串长度
  • 原型 size_t strlen(const char* str);
    输入指向字符串首地址的指针 输出size_t类型的整型 表示字符串长度
  • size_t类型的整型 应使用转换规范%zu(数值不大时也可以使用%d %u)
  • sizeof关键词测量数组本身占用空间的大小 返回结果也是size_t类型
#include<stdio.h>
#include<string>
int main()
{
          char str[20] = "hello";
          size_t size=sizeof(str);
          printf("sizeof=%d\n", size);//sizeof=20
          
          size_t len = strlen(str);
          printf("len=%d\n", len);//len=5
          return 0;
} 

strcat 拼接

  • 将源字符串拼接到目标字符串后面
  • 原型 char* stract(char* destination, const char* source);
    输入拼接目标字符串和源字符串首地址 输出拼接目标字符串首地址
  • 目标字符串后需要有足够空间 否则造成数组越界
#include<stdio.h>
#include<string>
int main()
{
        char dest[9] = "ilove";
        char src[4] = "you";
        
        //拼接前
        printf("%s\n", dest);//ilove
        printf("%s\n", src);//you
        
        //拼接字符串
        strcat(dest, src);
        
        //拼接后
        printf("%s\n", dest);//iloveyou
        printf("%s\n", src);//you
        
        return 0;
}  

strcpy 复制

  • 将源字符串复制到目标字符串中 即从首元素开始覆盖目标字符串
  • 原型 char* strcpy(char* destnation, char* source);
    输入复制目标字符串和源字符串首地址 输出复制目标字符串首地址
  • 目标字符串后需要有足够空间 否则造成数组越界
#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<string>
int main()
{
        char dest[9] = "ilove";
        char src[4] = "you";
        
        //复制前
        printf("%s\n", dest);//ilove
        printf("%s\n", src);//you
        
        //复制字符串
        strcpy(dest, src);
        
        //复制后
        printf("%s\n", dest);//you
        printf("%s\n", src);//you

        return 0;
}  

strcmp 比较

  • 用于比较两个字符串
    若一致则返回0
    若不一致 比较ASCII码 str1>str2返回1 否则返回-1
  • 原型 int strcmp(const char* str1, const char* str2);
    输入两个待比较字符串首地址 输出如上
#include<stdio.h>
#include<string>
 int main()
{
        const char* str1 = "abc";
        const char* str2 = "abcd";
        const char* str3 = "ab";
        
        //自己比自己
        int ret= strcmp(str1, str1);
        printf("%d\n", ret);//0
        
        //str1比str2
        ret =strcmp(str1, str2);
        printf("%d\n", ret);//-1
        
        //str1比str3
        ret = strcmp(str1, str3);
        printf("%d\n", ret);//1
        
        return 0;
}

自己写字符串处理函数

为了区分系统的函数 在自己写的函数前加前缀m

strlen

size_t mstrlen(const char* str)
{
        //检查输入参数的有效性 如果传入了空 直接返回0
        if (str == NULL)
                return 0;
        //长度从0开始累计
        size_t len= 0;
        //计算长度
        while (*str != '\0')
        {
                len++;
                str++;
        }
        return len;
}  
测试一下//能否处理异常和边界条件  
int main()
{
        size_t len;
        //空指针输入
        len = mstrlen(NULL);
        printf("%d\n", len);//0
        
        //空字符串输入
        len = mstrlen("");
        printf("%d\n", len);//0
        
        //字符串hello输入
        len = mstrlen("hello");
        printf("%d\n", len);//5
        
        return 0;
    }

strcat

char* mstract(char* destination, const char* source)
{
        //参数检查
        if (destination == NULL)
                return 0;
        if (source == NULL)
                return 0;

        //函数返回值是目标字符串首地址 因此需要保存这个地址 将destination赋值给指针ret
        char* ret = destination;

        //函数是从目标字符串'\0'开始赋值的 因此先把destination指针移动到'\0'处
        while (*destination != '\0')
                destination++;
        //遍历字符串source 将字符从destination现在的位置开始依次追究到其后
        while (*source != '\0')
        {
                *destination = *source;
                destination++;
                source++;
        }

        //给destination结束标记'\0'
        *destination = '\0';

        return ret;
}

strcpy

char* mstrcpy(char* destination, char* source)
{
        //参数检查
        if (destination == NULL)
                return 0;
        if (source == NULL)
                return 0;
        //保存目标字符串首地址
        char* ret = destination;
        //依次读取source中的字符
        while (*source != '\0')
        {
                //把source赋值给destination
                *destination = *source;
                destination++;
                source++;
        }
        //给destination加结束标记
        *destination = '\0';
        return ret;
}

strcmp

int strcmp(const char* str1, const char* str2)
{
        //检查str1和str2是否为空
        if (str1 == NULL && str2 == NULL)
                return 0;
        if (str1 != NULL && str2 == NULL)
                return 1;
        if (str1 == NULL && str2 != NULL)
                return -1;
        int ret;
        while (1)
        {
                //是否相等
                if (*str1 != *str2)
                {
                        //不相等
                        //字符比大小
                        if (*str1 > *str2)
                                ret = 1;
                        else
                                ret = -1;
                        break;
                }
                else 
                {
                        //相等
                        //是否同时为0
                        if (*str1 == '\0' && *str2 == '\0')
                        {
                                ret = 0;
                                break;
                        }

                        //继续比较
                        str1++;
                        str2++;
                }
        }
        return ret;
}