常见字符串函数二

strstr:寻找子字符串

        库函数:char* strstr(const char* str1,const char* str2),

返回值:如果存在,返回str2在str1中第一出现的位置;如果不存在,返回空指针NULL

const char* str1 = "hello world";
const char* str2 = "wor";
char* ret = strstr(str1,str2);
if (ret == NULL)
    printf("子串不存在"\n);
else 
    printf("%s\n", ret); // world
#include <stdio.h>
#include <assert.h>
// my_strstr的实现:
char* my_strstr(const char* p1, const char* p2)
{
    assert(p1 && p2);
    // 记录字符位置的指针:str1、str2
    char* str1 = p1;
    char* str2 = p2;
    // 判断p2指向的字符串是否为空
    if (p2 == "")
        return p1;
    while (*str1 != '\0') // 直到将str1比较完
    {
        p1 = str1;
        p2 = str2;
        while ((*p1 != '\0') && (*p2 != '\0') && (*p1 == *p2))
        {
            p1++;
            p2++;
        }
        if (*p2 == '\0')
            return str1;
        if (*p1 == '\0')
            return NULL;
        if (*p1 != *p2)
            str1++;
    }
}
int main()
{
    const char* p1 = "abbbcdef";
    const char* p2 = "bbc";
    // my_strstr 的实现:
    int ret = my_strstr(p1, p2);
    if (ret == NULL)
        printf("子串不存在\n");
    else 
        printf("%s\n", ret);
    return 0;
}

strtok:切割字符串

        库函数:char* strtok(char* str, const char* sep)

        第二个参数:sep指向的有分隔符组成的字符串;第一个参数:需要进行分隔的字符串

        函数工作:在字符串中找到分隔符,并用'\0'替换它,返回指向这一段字符的指针

        由于strtok函数会改变字符串本身的内容,所以一般切割的是临时拷贝的字符串

char* str = "zpw@bitdu.tech";
char* sep = "@.";
char buf[1024] = { 0 };
// 完成字符串的拷贝
strcpy(buf, str);
// 分割1
char* ret = strtok(buf, sep);
printf("%s\n, ret); // zpw
ret = strtok(NULL, sep);
printf("%s\n, ret); // bitdu
ret = strtok(NULL, sep);
printf("%s\n, ret); // tech

// 利用循环
char* ret = NULL;
for (ret = strtok(buf, sep); ret != NULL; ret=strtok(NULL,sep))
{
    printf("%s\n, ret);
}

        函数第一次切割字符串时,传入的第一个参数为字符串的首地址;在第二次之后,传入的第一个参数为NULL;

        函数中含有静态变量,会记录上次切割的位置,从该位置向后查找切割

        函数不再含有切割符,返回NULL空指针

strerror:字符串错误信息

        库函数:char* strerror(int errnum),返回错误码对应的错误信息

        errno:全局的错误码变量,当C语言的库函数在执行过程中发生了错误,就把对应的错误码赋值到errno变量中

字符分类函数:

        字符分类函数:头文件<ctype.h>
           iscntrl  -- 任何控制字符;        isspace -- 空白字符:空格、换页、换行、回车、制表符
           isdigit -- 十进制数字0~9;        isxdigit -- 十六进制数    islower -- 小写字母
           isupper -- 大写字母    isalpha -- 字母        isalnum -- 字母或数字    ispunct -- 标点符号
           isgraph -- 任何图形字符        isprint -- 任何可打印的 
       字符转换函数:
          tolower :转小写,int tolower(int c)
          toupper : 转大写,int toupper(int c)


版权声明:本文为m0_63404275原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。