字符串函数 strlen strcpy strcat strcmp strstr strtok strerror

目录

strlen的使用和模拟实现

使用部分:

模拟部分:

strcpy的使用和模拟实现

使用部分:

模拟部分:

strcat的使用和模拟实现

1.使用部分:

2.模拟部分

strcmp的使用和模拟实现

使用部分:

模拟部分:

str与strn的区别

strncpy的使用

strncat的使用

strcmp的使用

strstr的使用与模拟实现

使用部分

模拟部分

strtok的使用

strerror的使用


strlen的使用和模拟实现

使用部分:

strlen的原型是size_t strlen(const char* str)

字符串以'\0'作为结束标志,计算'\0'前面出现的字符个数。strlen是size_t类型(无符号整形)

3 - 6 = -3,但因为是无符号整形,没有负数,会被理解成很大的正数。

模拟部分:

strlen的模拟一般用两种方法,一种是设置一个计时器,另一种用指针-指针返回指针之间的元素个数来实现

第三种用递归(不创建临时变量)

第一种

size_t my_strlen(const char* str)
{
    int count = 0;
    while (*str++)
    {
        
        count++;
    }
    return count;
}

第二种

size_t my_strlen(const char* str)
{
    assert(str);
    char* st = str;
    while (*str)
    {
        str++;
    }
    return str - st;
}

第三种用递归

size_t my_strlen(const char* str)
{
    if (*str == '\0')
        return 0;
    else
        return 1 + my_strlen(str+1);//这里str+1不能是str++
}

strcpy的使用和模拟实现

使用部分:

原型:char *strcpy(char *dest, const char *src);

strcpy() 函数接受两个参数:

  • dest:要复制到的目标字符串的指针。
  • src:要复制的原字符串的指针。

另外,strcpy在复制字符串时会把原字符串的'\0'复制过去。

使用strcpy时,原字符串必须包含'\0'

目标空间必须可修改,也就是需要拷贝信息的字符串必须是可修改的

模拟部分:

void my_strcpy(char* dest, char* src)
{
    /*assert(dest != NULL);
    assert(src != NULL);*/
    assert(dest && src);
    char* s = dest;
    while (*dest++ = *src++) 
    {
    }
    dest = s;
}

用assert断言,传递的dest与src不能是为空,提高代码的安全性

*dest++ = *src++,虽然++的优先级比*的优先级高,但后置++,先使地址解引用,得到dest和src的内容,后*dest = *src,最后才是地址dest++,src++。

NULL本质上是0,一般用于指针的初始化

\0是\ddd形式的转义字符,本质上也是0,一般字符串的末尾会有'\0',是字符串的结束标志

null和NUL也是\0

'0' 字符0,本质是48,ASCII值为48

strcat的使用和模拟实现

strcat() 是一个 C 语言中的字符串库函数,用于将一个字符串(源字符串)追加到另一个字符串(目标字符串)的末尾

函数原型:char *strcat(char *dest, const char *src);

这个函数返回的是目标空间的地址。

使用要求:1.源字符串必须包含'\0',2.目标字符串也要包含'\0',3.目标空间必须足够大(可容纳源字符串的内容),4.目标空间必须可修改

1.使用部分:

注意,不能自己跟自己添加,会把字符串尾部的'\0'消掉。

2.模拟部分

char* my_strcar(char* dest, const char* src)
{
    char* ret = dest;
    while (*dest)
    {
        dest++;
    }
    while (*dest++ = *src++)
    {
        ;
    }
    return ret;
}

strcmp的使用和模拟实现

strcmp() 是 C 语言中的一个字符串比较函数,用于比较两个字符串的大小。函数的声明如下:

int strcmp(const char *str1, const char *str2);

trcmp() 函数会按照字典顺序(ASCII 值)比较 str1str2 指向的字符串。如果两个字符串相同,返回值为 0;如果 str1 小于 str2,返回值小于 0;如果 str1 大于 str2,返回值大于 0。

(从首位开始,比较字符的大小)

使用部分:

模拟部分:

int my_strcmp(const char* s1,const char* s2)
{
    //assert(dest && src);
    while (*s1 == *s2)//不能用*s1++ == *s2++
    {
        if (*s1 == '\0')
            return 0;
        s1++;
        s2++;
    }
    if (*s1 > *s2)
        return 1;
    else
        return -1;
}

str与strn的区别

strcpy  strcat  strcmp 的长度不受限制的字符串函数----不安全

与scanf的报错一致,不安全

strncpy  strncat  strncmp 的长度受限制的字符串函数

相对安全

strncpy的使用

strncpy() 是 C 语言中的一个字符串复制函数,用于将一个字符串的一部分复制到另一个字符串中。函数的声明如下:

char *strncpy(char *dest, const char *src, size_t n);

strncpy() 函数会将 src 指向的字符串的最多前 n 个字符复制到 dest 指向的字符串中。如果 src 的长度小于 n,则剩余的部分会用空字符 '\0' 来填充。函数返回指向 dest 的指针。

strncat的使用

strncat() 是 C 语言中的一个字符串追加函数,用于将一个字符串的一部分追加到另一个字符串的末尾。函数的声明如下:

char *strncat(char *dest, const char *src, size_t n);

strncat() 函数会将 src 指向的字符串的最多前 n 个字符追加到 dest 指向的字符串的末尾。函数返回指向 dest 的指针。

追加到末尾时增添一个'\0'

可以自己给自己追加

最多追加源字符串和'\0',再多就不会追加了,与strncpy不一样

strcmp的使用

strncmp() 是 C 语言中的一个字符串比较函数,用于比较两个字符串的前 n 个字符的大小。函数的声明如下:

int strncmp(const char *str1, const char *str2, size_t n);

strncmp() 函数会按照字典顺序(ASCII 值)比较 str1str2 指向的字符串的前 n 个字符。如果两个字符串的前 n 个字符相同,返回值为 0;如果 str1 小于 str2,返回值小于 0;如果 str1 大于 str2,返回值大于 0。

strstr的使用与模拟实现

strstr() 是 C 语言中的一个字符串查找函数,用于在一个字符串中查找另一个子字符串第一次出现的位置。函数的声明如下:

char *strstr(const char *haystack, const char *needle);

strstr() 函数会在 haystack 指向的字符串中查找第一次出现 needle 指向的子字符串的位置,并返回该位置的指针。如果找到了子字符串,则返回指向子字符串在原始字符串中的位置;如果未找到,则返回 NULL。

使用部分

模拟部分

查找时会遇到一下三种类似情况。

char* my_strstr(const char* str1, const char* str2)
{

    const char* cur = str1;
    const char* s1 = NULL;
    const char* s2 = NULL;
    assert(str1 && str2);
    if (!*str2)
        return (char*)str1;
    while (*cur)
    {
        s1 = cur;
        s2 = str2;
        while (*s1&&*s2&&*s1 == *s2)
        {
            s1++;
            s2++;
        }
        if (*s2 == '\0')
            return(char*)cur;
        cur++;
    }
    return NULL;
}
 

strtok的使用

strtok() 是C标准库中的一个函数,用于将字符串分割为标记(token)。它可以帮助你按照指定的分隔符将字符串分割成多个部分。

strtok() 函数的原型定义在 <string.h> 头文件中:

char *strtok(char *str, const char *delim);

在第一次调用时,str 应该是要分割的字符串,delim 是用来分割字符串的分隔符集合。之后如果你想继续分割同一个字符串,你可以将 str 参数设置为 NULL

strtok() 函数会返回分割后的子字符串,并且在内部保存一个静态指针指向字符串中未处理的部分。每次调用 strtok() 时,它会从上一次结束的地方开始继续分割。

strtok函数的第一个参数不为NULL,函数将找到str中的第一个标记,strtok函数将保存它在字符串的位置。

strtok函数的第一个参数为NULL,函数在同一个字符串中被保存的位置开始,查找下一个标记。

如果字符串中不存在更多的标记,则返回NULL指针。

int main()
{
    char arr[] = "hello*world/432";
    char* sep = "*/";
    char* str = NULL;
    for(str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep))
    {
        printf("%s\n", str);
    }
    return 0;
}

char*sep中可保存多个分隔符

//str = strtok(arr, sep)第一次找到后返回NULL,后str = strtok(NULL, sep)找到断点位置循环

strerror的使用

strerror() 是C标准库中的一个函数,用于将错误码转换为对应的错误消息字符串。这个函数非常有用,可以帮助程序员在出错时获得可读的错误信息。

strerror() 函数的原型定义在 <string.h> 头文件中:

char *strerror(int errnum);

errnum 参数是一个表示错误码的整数值,通常是由系统调用或库函数返回的错误码。strerror() 函数会根据给定的错误码返回对应的错误消息字符串。

加上头文件#include <errno.h>

当代码出现错误时,会有一个全局变量errno储存报错信息

  • 40
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
strlenstrcpystrcmpstrcat都是C语言中的字符串处理函数。其中strlen是用来计算字符串的长度的函数,其语法为:size_t strlen(const char *str),其中str表示需要计算长度的字符串。该函数的返回值为一个size_t类型的无符号整数,表示字符串的长度,不包括空字符('\0')。例如,若str为"hello",则strlen(str)的结果为5。 strcpy是用于将一个字符串复制到另一个字符串中的函数。其语法为:char *strcpy(char *dest, const char *src),其中dest表示目标字符串的地址,src表示需要复制的源字符串的地址。该函数会将src中的内容复制到dest中,并返回dest的值。例如,若src为"hello",dest为一个长度为10的字符数组,则执行strcpy(dest, src)后,dest数组中就存储了"hello"这个字符串strcmp是用于比较两个字符串是否相等的函数。其语法为:int strcmp(const char *s1, const char *s2),其中s1和s2表示需要比较的两个字符串。该函数会先比较s1和s2的第一个字符,若相同则继续比较后面的字符,直到不相等为止。返回值为一个整数,若s1>s2则返回正整数,若s1<s2则返回负整数,若s1=s2则返回0。例如,若s1为"abc",s2为"abd",则执行strcmp(s1, s2)后,返回的值为负整数。 strcat是用于将两个字符串连接起来的函数。其语法为:char *strcat(char *dest, const char *src),其中dest表示目标字符串的地址,src表示需要添加的源字符串的地址。该函数会将src中的内容添加到dest的末尾,并返回dest的值。例如,若dest为"hello",src为"world",则执行strcat(dest, src)后,dest数组中存储了"helloworld"这个字符串

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值