C语言——自己实现字符串操作API

目录

1、gets()输入

2、puts()输出

3、strlen()计算字符串长度

4、memset()初始化字符串

1-4的demo

5、strcpy()拷贝

6、strcat()拼接

7、strcmp()比较

5-7的demo

8、strchr()查找字符

9、strlwr()转换小写字母

8-9的demo

10、strtok()字符串分割


1、gets()输入

int myGets(char *p)
{
        int cnt = 0;

        if(p == NULL){
                printf("内存非法");
                return -1;
        }

        while(*p = getchar()){
                if(*p == '\n'){        //以回车结束
                        *p = '\0';
                        break;
                }else{
                        cnt++;
                        p++;
                }
        }
        return cnt;    //返回输入字符串长度
}

2、puts()输出

void myPuts(char *p)
{
        while(*p != '\0'){
                putchar(*p++);
        }
        putchar('\n'); //puts自带回车
        return;
}

3、strlen()计算字符串长度

int myStrlen(char *p)
{
        int n = 0;
        while(*p != '\0'){
                n++;
                p++;
        }
        return n;
}

4、memset()初始化字符串

void myMemset(char *p, char a, int n)
{
        while(n){
                *p = a;
                p++;
                n--;
        }
        return;
}

1-4的demo

int main()
{
        int n;
        int cnt;
        char str[128];
        myMemset(str, 'a', 128);    //初始化为a
        str[127] = '\0';            //最后一个位置赋结束符
        myPuts(str);                //输出
        cnt = myGets(str);          //输入
        n   = myStrlen(str);        //计算字符串长度
        myPuts(str);                //输出
        printf("cnt=%d,n=%d\n",cnt,n);    //验证输入的长度,和strlen出来的长度是否一样
        return 0;
}

/*
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
xiao wei
xiao wei
cnt=8,n=8
*/

5、strcpy()拷贝

char* myStrcpy(char *p, char *src)
{
        if(p == NULL || src == NULL){
                return NULL;
        }

        while(*src != '\0'){
                *p = *src;
                p++;
                src++;
        }
        *p = '\0';    //最后结束符

        return p;
}

6、strcat()拼接

void myStrcat(char *str, char *sr)
{
        while(*str != '\0'){
                str++;
        }

        while(*sr != '\0'){
                *str++ = *sr++;
        }

        *str = '\0';
}

7、strcmp()比较

int myStrcmp(char *str, char *src)
{
        int size1 = 0;
        int size2 = 0;
        while(*str != '\0'){      //先比较2个字符串的个数
                size1++;
                str++;
        }
        while(*src != '\0'){
                size2++;
                src++;
        }                        
        if(size1 > size2)
                return 1;
        else if(size1 < size2)
                return -1;
        str -= size1;            //因为前面的指针移动,所以要恢复回去
        src -= size2;

        while(*str != '\0' && *src != '\0'){
                if(*str > *src)
                        return 1;
                else if(*str < *src)
                        return -1;
                str++;
                src++;
        }

        return 0;
} 

5-7的demo

int main()
{
        char *src = "xiao wei";
        char *sr  = " !!!";
        char str[128] = {'\0'};
        myStrcpy(str, src);        //cp字符串
        myPuts(str);
        printf("strcmp 1: %d\n",myStrcmp(str,src));    //比较,现在2字符串是相同的,因为前面的拷贝

        myStrcat(str, sr);    //拼接字符串
        myPuts(str);
        printf("strcmp 2: %d\n",myStrcmp(str,src));  //比较,因为前面拼接,所以str大于scr,返回1

        return 0;
}

/*
xiao wei
strcmp 1: 0
xiao wei !!!
strcmp 2: 1
*/

8、strchr()查找字符

返回字符位置的地址

char* myStrchr(char *p, char a)
{
        while(*p != '\0'){
                if(*p == a){
                        return p;
                }
                p++;
        }
        return NULL;
}

9、strlwr()转换小写字母

转的字符串必须是char str[128]出来的,char *src = "Xiao Wei !!!";出来的,会在转小写那里段错误

本质原因:char *src = "Xiao Wei !!!";  存放在常量区,是无法修改的。而数组是存放在栈中,是可以修改的。

参考博文

char* myStrlwr(char *str)
{

        char *p = str;
        while(*p != '\0')
        {
                if(*p > 'A' && *p <= 'Z')
                {
                        *p += 32;  //转小写,,,这里出现段错误
                }
                p++;
        }
        return str;
}

8-9的demo

int main()
{
        //char *src = "Xiao Wei !!!";        //这样写,无法修改,会出现段错误
        
/*      可以下面这样写,malloc分配内存
        char *src;        
        src = (char *)malloc(sizeof(char)*20);
        strcpy(src, "Xiao Wei !!!");
*/
    
        char src[20] = "Xiao Wei !!!";

        char *str = NULL;
        char a = 'a';

        str = myStrchr(src, 'e');
        if(str == NULL){
                printf("No char\n");
        }else{
                myPuts(str);
        }

        printf("strLwr:%s\n",myStrlwr(src));

        return 0;
}

/*
ei !!!
strLwr:xiao wei !!!
*/

10、strtok()字符串分割

该函数参考strtok函数源码

该函数返回被分割的第一个子字符串,如果没有可检索的字符串,则返回一个空指针

char* my_strtok(char* string_org,const char* demial)
{
        static unsigned char* last;
        unsigned char* str;
        const unsigned char* ctrl = (const unsigned char*)demial;
        unsigned char map[32];
        int count;

        for (count =0; count <32; count++){
                map[count] = 0;
        }
        do {
                map[*ctrl >> 3] |= (1 << (*ctrl & 7));
        } while (*ctrl++);
        if (string_org){
                str = (unsigned char*)string_org;
        } else{
                str = last;
        }
        while ((map[*str >> 3] & (1 << (*str & 7)))  && *str){
                str++;
        }
        string_org = (char*)str;
        for (;*str; str++){
                if ( map[*str >> 3] & (1 << (*str & 7))){
                        *str++ = '\0';
                        break;
                }
        }
        last =str;
        if (string_org == (char*)str){
                return NULL;
        }else{
                return string_org;
        }
}
int main()
{
        //char *src = "Xiao Wei !!!";
        char src[20] = "Xiao Wei !!!";
        char *str = NULL;
        str = my_strtok(src," ");
        while(str)
        {
                printf("%s\n",str);
                str = my_strtok(NULL," ");
        }

        return 0;
}


/*
Xiao
Wei
!!!
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dz小伟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值