一篇文章教你用C语言模拟实现字符串函数

编辑: admin 分类: c#语言 发布时间: 2021-12-12 来源:互联网
目录
  • 前言
  • 模拟
    • 1.strlen 函数
  • 2.strcpy 函数
    • 3.strcat 函数
      • 4.strcmp函数
        • 5.strncpy函数
          • 6.strncat函数
            • 7.strncmp函数
              • 8.strstr函数
                • 9.strtok函数
                  • 总结

                    前言

                    编程过程中经常会使用到一些字符串函数,这些字符串函数都在C语言标准库中,我们可以直接使用。但我们也要了解一下它们是如何实现的。

                    模拟

                    1.strlen 函数

                    strlen函数是用来求字符串长度的。官方给出的解释如图

                    返回值类型是无符号整型,参数类型是char*,遇见\0停止。

                    strlen的模拟实现有三种方法,1、count计数。2、递归。3、指针减指针。

                    count计数

                    #include <stdio.h>
                    int my_strlen(const char* str) {
                    	int count = 0;
                    	while (*str++) {
                    		count++;
                    	}
                    	return count;
                    }
                    int main() {
                    	char str[] = "abcdefg";
                    	int len = my_strlen(str);
                    	printf("%d", len);
                    	return 0;
                    }

                    递归

                    #include <stdio.h>
                    int my_strlen( const char* str) {
                    	if (*str == '\0') {
                    		return 0;
                    	}
                    	else {
                    		return my_strlen(++str) + 1;
                    	}
                    }
                    int main() {
                    	char str[] = "abcdefg";
                    	int len = my_strlen(str);
                    	printf("%d", len);
                    	return 0;
                    }

                    指针减指针

                    #include <stdio.h>
                    int my_strlen(const char* str) {
                    	char* p = str;
                    	while (*p) {
                    		p++;
                    	}
                    	return p - str;
                    }
                    int main() {
                    	char str[] = "abcdefg";
                    	int len=my_strlen(str);
                    	printf("%d", len);
                    	return 0;
                    }

                    2.strcpy 函数

                    strcpy函数是字符串拷贝函数。就是把源地址字符串拷贝到目的地址去。源地址字符串必须有\0。目的地址必须足够大。源地址字符串的\0也会拷贝过去,返回目的地址的地址。

                    官方解释如图

                    模拟实现

                    #include <stdio.h>
                    char* my_strcpy(char* dest,const char* sour) {
                        char* p=dest;
                    	while (*dest++ = *sour++) {
                    		;
                    	}
                        return p;
                    }
                    int main() {
                    	char sur[] = "abcdefg";
                    	char dest[10] = { 0 };
                    	printf("%s", my_strcpy(dest,sur));
                    	return 0;
                    }

                    3.strcat 函数

                    strcat函数是字符串追加函数。就是把源地址字符串追加到目的地址后边。要注意的是当遇见源地址的\0时停止,目的地址必须可修改,且足够大。strcat函数不能用于追加字符串自己,会越界,根本停不下来。

                    官方解释如图

                    模拟实现

                    #include <stdio.h>
                    char* my_strcat(char* str2,const char* str1) {
                    	char* p = str2;
                    	while (*str2++){
                    		;
                    	}
                    	str2--;
                    	while (*str2++ = *str1++) {
                    		;
                    	}
                    	return p;
                    }
                    int main() {
                    	char str1[] = "abcdefg";
                    	char str2[20]="abc";
                    	printf("%s", my_strcat(str2, str1));
                    	return 0;
                    }

                    4.strcmp函数

                    strcmp函数是字符串比较函数,如果str1比str2大就返回正值,str1比str2小返回负值。str1=str2比较下一对字符。只要有一个遇见\0就停止。

                    官方解释如图

                    模拟实现

                    #include <stdio.h>
                    int my_strcmp( const char* str1,const char* str2) {
                    	while (*str1++-*str2++==0 && *str1!='\0' && str2!='\0') {
                    		;
                    	}
                    	return *--str1 - *--str2;
                    }
                    int main() {
                    	char str1[] = "abcdefg";
                    	char str2[] = "bbcdef";
                    	int a=my_strcmp(str1,str2);
                    	printf("%d", a);
                    	return 0;
                    }

                    5.strncpy函数

                    strncpy函数是长度受限制的字符串拷贝函数,可以指定拷贝多少给字节,当给定的字节数大于要拷贝的字符串时,不够的用\0补充。

                    官方解释

                    模拟实现

                    #include <stdio.h>
                    char* my_strncpy(char* dest,const char* sour,int num) {
                    	char* p = dest;
                    	while (num--) {
                    		if (*sour != '\0') {
                    			*dest++ = *sour++;
                    		}
                    		else {
                    			*dest++ = '\0';
                    		}
                    	}
                    	return p;
                    }
                    int main() {
                    	char sur[] = "abcdefg";
                    	char dest[10] = { 0 };
                    	printf("%s", my_strncpy(dest, sur,10));
                    	return 0;
                    }

                    6.strncat函数

                    strncat函数,需要注意的一点是,字符串追加完成后目的地址斜杠零是追加完后自己补充的。所以它可以实现自己给自己 追加。

                    官方解释

                    模拟实现

                    #include <stdio.h>
                    char* my_strncat(char* str2,const char* str1,size_t num) {
                    	char* p = str2;
                    	while (*str2++){
                    		;
                    	}
                    	str2--;
                    	while (num--) {
                    		if (*str1 != '\0') {
                    			*str2++ = *str1++;
                    		}
                    	}
                    	*str2 = '\0';
                    	return p;
                    }
                    int main() {
                    	char str1[] = "abcdefg";
                    	char str2[20]="abc";
                    	printf("%s", my_strncat(str2, str1,6));
                    	return 0;
                    }

                    7.strncmp函数

                    strncmp函数,比较字符串,和strcmp类似只是可以确定比较前几个字符。

                    官方解释

                    模拟实现

                    #include <stdio.h>
                    int my_strncmp( const char* str1,const char* str2,size_t num){
                    	while (num--&& *str1++-*str2++==0 && *str1!='\0'&& str2!='\0') {
                    		;
                    	}
                    	return (*--str1 - *--str2);
                    }
                    int main() {
                    	char str1[] = "abcdefg";
                    	char str2[] = "bbcdef";
                    	int a=my_strncmp(str1,str2,5);
                    	printf("%d", a);
                    	return 0;
                    }

                    8.strstr函数

                    strstr函数就是在一个字符串里找子字符串。

                    官方解释

                    模拟实现

                    #include <stdio.h>
                    const char* my_strstr(const char* str1, const char* str2) {
                    	while (*str1) {
                    		const char* p1 = str1;
                    		const char* p2 = str2;
                    		while (*p1++ == *p2++) {
                    			;
                    		}
                    		if (*--p2 == '\0') {
                    			break;
                    		}
                    		else {
                    			str1++;
                    		}
                    	}
                    	return str1;
                    }
                    int main() {
                    	char str1[] = "abbbcdefg";
                    	char str2[] = "bcde";
                    	int len = strlen(str2);
                    	const char* p = my_strstr(str1, str2);
                    	while (len--) {
                    		printf("%c", *p++);
                    	}
                    	return 0;
                    }

                    9.strtok函数

                    strtok函数是字符串切割函数,用的比较少也比较难懂。用的是时候要给一个用做分隔符的字符集合。strtok函数找到分隔符后将其置为0.返回一个指向该标记的指针。如果第一个参数不为空则strtok找到第一个分隔符将其置零并记录该处地址,第二次调用strtok则传一个NULL则strtok会从前一个'\0‘处往后找下一个分隔符。

                    官方解释

                    模拟实现

                    #include <string.h> 
                    #include <stdio.h> 
                    char* my_strtok(char* str, char* demion)
                    {
                        static char* p_last = NULL;
                        if (str == NULL && (str = p_last) == NULL)
                        {
                            return NULL;
                        }
                        char* s = str;
                        char* t = NULL;
                        while (*s != '\0')
                        {
                            t = demion;
                            while (*t != '\0')
                            {
                                if (*s == *t)
                                {
                                    p_last = s + 1;
                                    if (s - str == NULL)
                                    {
                                        str = p_last;
                                        break;
                                    }
                                    *s = '\0';
                                    return str;
                                }
                                t++;
                            }
                            s++;
                        }
                        return NULL;
                    }
                    int main(void)
                    {
                        char str[] = "liusen,lin,lll";
                        char* result = NULL;
                        result = my_strtok(str, ",");
                        printf("%s\n", result);
                        result = my_strtok(NULL, ",");
                        printf("%s\n", result);
                        return 0;
                    }
                     

                    总结

                    本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注海外IDC网的更多内容!

                    【文章转自:韩国cn2服务器 转载请保留连接】