#include<初见c语言之字符函数和字符串函数>

目录

一、字符分类函数

二、字符转换函数

三、strlen的使⽤和模拟实现

1.strlen使用

2.strlen函数的模拟实现 

四、 strcpy的使⽤和模拟实现

1.strcpy使用

2.strcpy函数的模拟实现

五、strcat的使用和模拟实现

1.strcat的使用

2.strcat的模拟实现

六、strcmp的使用和模拟实现

1.strcmp的使⽤

2.strcmp模拟实现

七、strncpy函数的使用

 八、 strncat函数的使用

九、strncmp函数的使用

十、strstr函数使用和模拟实现

1. strstr使用

          2.strstr模拟实现

十一、 strtok函数的使用

十二、  strerror函数的使用

总结


一、字符分类函数

<cctype> (ctype.h) - C++ Reference (cplusplus.com)

可以通过以上这个网站找到相关函数的参数和作用

 islower函数演示

练习:写一个代码,将字符串的小写字母转大写,其他字符不变

代码如下:

#include <stdio.h>

#include <ctype.h>

int main()
{
    char arr[] = "I Am a Student";
    //            I Am a Student\0
    //            0123
    int i = 0;
    while (arr[i] != '\0')
    {
        //之前:if (arr[i] >= 'a' && arr[i] <= 'z')
        //之后:
        if(islower(arr[i]))
        {
            arr[i] -= 32;
        }
        i++;
    }
    printf("%s\n",arr);

    return 0;
}

结果展示:

 


二、字符转换函数

#include <stdio.h>

#include <ctype.h>

int main()
{
    //printf("%c\n", toupper('a'));
    //printf("%c\n", toupper('B'));
    //printf("%c\n", tolower('B'));
    

    char arr[] = "I Am a Student";
    //            I Am a Student\0
    //            0123
    int i = 0;
    while (arr[i] != '\0')
    {
        //之前:if (arr[i] >= 'a' && arr[i] <= 'z')
        //之后:
        //if(islower(arr[i]))
        if(isupper(arr[i]))
        {
            //arr[i] = toupper(arr[i]);
            arr[i] = tolower(arr[i]);
        }
        i++;
    }
    
    printf("%s\n",arr);

    return 0;
}

 运行结果:

 


三、strlen的使⽤和模拟实现

strlen函数:

  • 求字符串的长度,统计的是\0之前的字符个数
  • 字符串中必须有\0
  • strlen的使⽤需要包含头⽂件

1.strlen使用

#include<string.h>
int main()
{
    if ((int)strlen("abc") - (int)strlen("abcdef")>0)
    {
        printf(">\n");
    }
    else
    {
        printf("<=0\n");
    }
    return 0;
}

结果展示:

 

2.strlen函数的模拟实现 

方式1:

//计数器⽅式
int my_strlen(const char * str)
{
        int count = 0;
        assert(str);
        while(*str)
        {
                count++;
                str++;
        }
        return count;
}

方式2:

//计数器⽅式

#include<assert.h>

size_t my_strlen(const char* s)
{
    assert(*s !=NULL);
    int count = 0;
    while (*s != '\0')
    {
        count++;
        s++;
    }
    return count;

方式3:

 //指针-指针的⽅式
int my_strlen(char *s)
{
        assert(str);
        char *p = s;
        while(*p != ‘\0’ )
        p++;
        return p-s;
}

 结果展示:


四、 strcpy的使⽤和模拟实现

strcpy函数:

  • •源字符串必须以 '\0' 结束。
  • 会将源字符串中的 '\0' 拷⻉到⽬标空间。
  • ⽬标空间必须⾜够⼤,以确保能存放源字符串。
  • ⽬标空间必须可修改。

1.strcpy使用

int main()
{
    char arr1[] = "hello bit";
    char arr2[20] = "xxxxxxxxxxxxxxx";
    strcpy(arr2, arr1);

    printf("%s\n", arr2);
    //%s遇到\0不打印
    return 0;
}

结果展示: 

 

2.strcpy函数的模拟实现

char* my_strcpy(char* des, const char* src)
{
    assert(*des != NULL);
    assert(*src != NULL);
    //拷贝\0之前的
    char* ret = des;
    while (*des++ = *src++)
    {
        ;
    }
    return ret;
    //拷贝\0之后的
    *des = *src;
}


int main()
{
    char arr1[] = "hello bit";
    char arr2[20] = "xxxxxxxxxxxxxxx";
    my_strcpy(arr2, arr1);

    printf("%s\n", arr2);
    //%s遇到\0不打印
    return 0;
}

 结果展示:

一趟冒泡排序后,如果 一对没有交换,就说明已经有序了


五、strcat的使用和模拟实现

strcat函数:

  • 源字符串必须以 '\0' 结束。
  • ⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。
  • ⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。
  • ⽬标空间必须可修改

1.strcat的使用

int main()
{
    char arr1[20] = "hello ";//hello world
    char arr2[] = "world";
    //char arr2[] = {'w','o','r','l','d'};//err
    //char* s = my_strcat(arr1, arr2);
    //printf("%s\n", arr1);
    //printf("%s\n", s);
    printf("%s\n", strcat(arr1, arr2));

    return 0;
}

结果展示:

2.strcat的模拟实现

#include<string.h>
#include<assert.h>
 char* my_strcat(char* dest, const char* src)
{
     assert(dest && src);
     char* ret = dest;
    //1.找到目标空间的\0
     while (*dest != '\0')
     {
         *dest++;
     }
     //2.拷贝
     while (*dest++ = *src++)
     {
         ;//空语句
     }
     return ret;
}
int main()
{
    char arr1[20] = "hello ";//hello world
    char arr2[] = "world";
    //char arr2[] = {'w','o','r','l','d'};//err
    char* s = my_strcat(arr1, arr2);
    printf("%s\n", arr1);
    printf("%s\n", s);
    printf("%s\n", my_strcat(arr1, arr2));

    return 0;
}

结果展示: 

 


六、strcmp的使用和模拟实现

strcmp函数:

  •  第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字
     
  • 第⼀个字符串等于第⼆个字符串,则返回0
     
  • 第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字

1.strcmp的使⽤

int main()
{
    //char arr1[] = "abcedf";
    //char arr2[] = "abcedf";
    //if (arr1 == arr2)//比较的是地址
    //{

    //}
    //if ("abcedf" == "abcedf")//也比较的是地址,首字符的地址比较
    //{

    //}
    //如果要比较两个字符串的内容,需要使用strcmp
    //int strcmp(const char* str1,const char* str2)
    char arr1[] = "abqedf";
    char arr2[] = "abc";
    int ret = strcmp(arr1, arr2);
    printf("%d\n", ret);
    
    return 0;
}

结果演示:

2.strcmp模拟实现

int my_strcmp(const char* str1, const char* str2)
{
    assert(str1 && str2);
    while (*str1 == *str2)
    {
        if (*str1 == '\0')
            return 0;
        *str1++;
        *str2++;

    }
    return *str1 - *str2;

}
int main()
{
    char arr1[] = "abqedf";
    char arr2[] = "abdf";
    int ret = my_strcmp(arr1, arr2);
    printf("%d\n", ret);
    return 0;
}

结果展示:

 


七、strncpy函数的使用

  • 拷⻉num个字符从源字符串到⽬标空间。
  • 如果源字符串的⻓度⼩于num,则拷⻉完源字符串之后,在⽬标的后边追加0,直到num个。

int main()
{
    char arr1[] = "abcedf";
    char arr2[20] = {0};
    strncpy(arr2, arr1, 8);

    printf("%s\n", arr2);
}

结果展示:


 八、 strncat函数的使用

 

  •  将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加⼀个 \0 字
  • 如果source指向的字符串的⻓度⼩于num的时候,只会将字符串中到\0 的内容追加到destination指向的字符串末尾。

int main()
{
    char arr1[] = "abcedf";
    char arr2[20] = "xx\0xxxxxxx";
  int len = strlen(arr1);
    strncat(arr2, arr1, len);

    printf("%s\n", arr2);
}

 

结果展示:

 

九、strncmp函数的使用

  • ⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回0。

int main()
{
    char arr1[] = "abcedf";
    char arr2[20] = "abq";
    int ret = strncmp(arr1, arr2, 6);

    printf("%d\n", ret);
}

结果展示:

 


十、strstr函数使用和模拟实现

  • 函数返回字符串str2在字符串str1中第⼀次出现的位置。
  • 字符串的⽐较匹配不包含 \0 字符,以 \0 作为结束标志。

1. strstr使用

int main()
{
    char arr1[] = "this is an apple";
    const char* p = "pl";
    char* ret = strstr(arr1, p);
    if (ret != NULL)
    {
        printf("%s\n", ret);
    }
    else
    {
        printf("找不到");

    }
    return 0;
}

 

结果展示:

 

 2.strstr模拟实现

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

}

int main()
{
    char arr1[] = "abcdef";
    char arr2[] = "bbq";
    char* ret = my_strstr(arr1, arr2);
    if (ret == NULL)
        printf("找不到");
    else
        printf("%s\n", ret);

    return 0;
}

结果展示:

 


十一、 strtok函数的使用

  •  sep参数指向⼀个字符串,定义了⽤作分隔符的字符集合
  • 第⼀个参数指定⼀个字符串,它包含了0个或者多个由sep字符串中⼀个或者多个分隔符分割的标记。
  • strtok函数找到str中的下⼀个标记,并将其⽤ \0 结尾,返回⼀个指向这个标记的指针。(注:
  • strtok函数会改变被操作的字符串,所以在使⽤strtok函数切分的字符串⼀般都是临时拷⻉的内容并且可修改)

int main()
{
    char arr[] = "zpengwei@yeah.net@heheh";
    char arr2[30] = { 0 };//"zpengwei\0yeah\0net"
    strcpy(arr2, arr);
    const char* sep = "@.";
    char* ret = NULL;

    for (ret = strtok(arr2, sep); ret != NULL;ret=strtok(NULL,sep))
    {
        printf("%s\n", ret);
    }


    //ret = strtok(arr2, sep);
    //printf("%s\n", ret);

    //ret = strtok(NULL, sep);
    //printf("%s\n", ret);

    //ret = strtok(NULL, sep);
    //printf("%s\n", ret);

    return 0;
}

 

 结果展示:

十二、  strerror函数的使用

  • strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。

int main()
{
    int i = 0;
    for (i = 0; i < 10; i++)
    {
        printf("%d:  %s\n",i, strerror(i));
    }
    
    return 0;
}


 

结果展示:

打开文件错误时: 

 

int main()
{
    //fopen以读的形式打开文件的时候,如果文件不存在,就打开失败
    FILE* pf = fopen("test.txt", "r");
    if (pf == NULL)
    {
        printf("%s\n", strerror(errno));
        return 1;
    }
    //读文件

    //关闭文件
    fclose(pf);

    return 0;

}

 


总结

字符函数和字符串函数的使用和模拟实现。

  • 30
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值