strcat的使用和模拟

#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strcat(char* dest, const char* src)
{
    assert(dest);
    assert(src);
    char ret = dest;
    //找到 \0
    while (*dest != '\0')
    {
        dest++;
    }
    //拷贝
    while (*dest = *src)
    {
        ;
    }
    return ret;
}
int main()
{
    char arr1[30] = "hello";
    //需要在目的地预留足够的空间
    char arr2[] = "world";
    my_strcat(arr1, arr2);
    printf("%s\n",arr1);
    return 0;
}

字符串操作函数中最主要的的步骤是找到‘\0’,这是一个字符串结束的标志,当然在一个字符串中扩展更多的字符,就需要在目标字符串中开辟足够多的空间,不然会导致指针非法访问,在2019VC编译器中编译器依然会将溢出的字符串打印出来,会报错。



strstr的模拟实现

#include <stdio.h>
#include <assert.h>
char* my_strstr(const char* p1, const char* p2)
{
    assert(p1 != NULL && p2 != NULL);
    char* s1 = NULL;
    char* s2 = NULL;
    char* cur = (char*)p1;
    if (p2=='\0')
    {
        return (char*)p1;
    }
    while (*cur)
    {
        s1 = cur;
        s2 = (char*)p2;

        while (*s1  && *s2  && (*s1 == *s2))
        {
            s1++;
            s2++;
        }
        if (*s2 == '\0')
        {
            return cur;
        }
        if (*s1 == '\0')
        {
            return NULL;
        }
        cur++;
    }
    return NULL;//找不到字符串
}
int main()
{
    char* p1 = "abcdddddefffff";
    char* p2 = "ddefff";
    char* ret = my_strstr(p1, p2);
    if (ret==NULL)
    {
        printf("子串不存在\n");
    }
    else
    {
        printf("%s\n", ret);
    }
    return 0;
}

strstr是一个寻找子字符串的函数,库函数中会实现找到对应子字符串并打印出子字符串之后的原字符串中的字符,返回值是一个指针,指向原字符串中子字符串所在的地方,所以在模拟实现的时候就需要考虑到,一些 比较特殊的情况,比如在abbbcdef中寻找bcd,所以在使用完一次寻找之后,就要进行下一次寻找,只不过这次的开始,在上次开始的下一个指针,如此寻找,直到找完走后一个字符。在函数中依然使用const和assert进行对于函数的健壮。最终实现与库函数同样的功能。



strtok 字符串的分隔

#include <stdio.h>
#include <string.h> 
int main()
{
    char arr[] = "2091222659@qq.com";
    char* p = "@.";
    char buf[1024];
    strcpy(buf, arr);
    char* ret;
    for (ret = strtok(buf, p); ret != NULL; ret = strtok(NULL, p))
    {
        printf("%s\n", ret);
    }
    return 0;
}

这个函数会将字符串在对应的分隔符下进行分割,然后返回每一串字符的首字符地址,由于这个函数会改变原字符串,所以一般都是先将字符串拷贝一份,再进行分割,比如在以上函数中,字符串2091222659@qq.com ,在函数strtok中,分别输入首字符地址,和分隔符的地址,分隔符可以是一个或者多个,遇到时便会将对应的分隔符替换为‘\0’。然后第一次以后的分隔就不需要再在第一个参数的位置输入有效的地址,因为这个函数会存储上次分隔之后的位置,直接在下次继续在对应的位置分隔,在第一个参数的位置输入null就行。打印的结果也很简单
2091222659
qq
com
这就是程序运行的结果。



strerror

#include <stdio.h>
#include <string.h>
int main()
{
    //错误码      错误信息
    //0      -     No error
    //1      -     Operation not permitted
    //2      -     No such file or directory
    //3      -     No such process
    //...
    //将错误码翻译成错误信息
    //errno 是一个错误码的全局变量
    //当C语言的库函数在执行中发生了错误,就会把对应的错误码,赋值到errno中。
    //
    //char* str = strerror(errno);
    //printf("%s\n", str);
    FILE* pf = fopen("text.txt", "r");
    if (pf == NULL)
    {
        printf("%s\n", strerror(errno));
    }
    else
    {
        printf("open file success\n");
    }
    return 0;
}

这是一个比较特殊的字符串操作函数,其实可以理解为一个翻译函数,函数内部将各种各样的错误都对应成了不同的错误码,0,1,2,3...等等,这个函数就是将错误码翻译成对应的文字,让程序员或者用户理解哪里出现了错误。使用的时候参数输入为errno就可以了。