如何手动实现C语言中的字符串操作

来源:互联网 发布:软件项目经理责任制 编辑:程序博客网 时间:2024/06/06 06:30

学了字符串操作,很多人也许学了大概知道怎么用,但是太久没用就忘了,恰恰这是找软件工程师或者嵌入式工程师以及C,C++相关的笔试面试必考的题目!接下来我们来看看如何手动实现这些相关的函数。

     废话不多说,直接上代码:得意

#include<stdio.h>#include <stdlib.h>//字符串拷贝 char * strcpy(char * dest,const char *src) ;char * strncpy(char * dest,const char *src,size_t count) ; //字符串黏贴 char * strcat(char * dest, const char * src) ; char * strncat(char *dest, const char *src, size_t count) ;//字符串比较 int strcmp(const char * cs,const char * ct) ;//字符串查找 char * strchr(const char * s, int c) ;char * strrchr(const char * s, int c);//计算字符串有多少个字节 int strlen(const char * s);//将s中前n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。void * memset(void * s,int c,size_t count) ;//内存拷贝函数 void * memcpy(void * dest,const void *src,size_t count);//由src所指内存区域复制count个字节到dest所指内存区域。void * memmove(void * dest,const void *src,size_t count) ;//比较内存区域buf1和buf2的前count个字节。该函数是按字节比较的。 int memcmp(const void * cs,const void * ct,size_t count);int main(void){//定义一个字符串 char *str = "Hello world!";char *str1 = "hello world!";char *str2 = "yangyuanxin";char buffer[256];//将数组的256块存储区域清空 memset(buffer , 0 ,256) ;//将字符串str拷贝到buffer这个数组空间里去 strcpy(buffer , str);printf("buffer:\n%s\n",buffer);//比较字符串str与str1是否相同 if(strcmp(str,str1) == 0){printf("字符串比较相同!\n");}else{printf("字符串比较不同\n");}//将str1黏贴到buffer这个字符串的后面 strcat(buffer , str1);printf("buffer:\n%s\n",buffer);//计算字符串的大小 printf("len:%d %d %d\n",strlen(str1),strlen(str),strlen(buffer));//从前往后查找 printf("%s\n",strchr(str1 ,'o'));//从后往前查找 printf("%s\n",strrchr(str1 ,'d'));//由str2所指内存区域复制11个字节到buffer所指内存区域。memmove(buffer , str2 , 11) ;printf("%s\n",buffer);//拷贝,跟memmove差不多的 memcpy(buffer , str1 ,11);printf("%s\n",buffer);//内存比较if(memcmp(buffer , str2 ,11) == 0){printf("内存区域相同!\n");}else{printf("内存区域不同!\n");}return 0 ;}char * strcpy(char * dest,const char *src){char *tmp = dest;while ((*dest++ = *src++) != '\0')  //判断拷贝有没有到伪0/* nothing */;return tmp;}char * strncpy(char * dest,const char *src,size_t count){char *tmp = dest;while (count) {   //count指的是要拷贝多少个字节if ((*tmp = *src) != 0) src++;tmp++;count--;}return dest;}char * strcat(char * dest, const char * src){char *tmp = dest;while (*dest)dest++;while ((*dest++ = *src++) != '\0') //将src这个字符串黏贴到dest这个字符串的后面去;return tmp;}char * strncat(char *dest, const char *src, size_t count){char *tmp = dest;if (count) {   //要黏贴多少个字节,这个接口比上面那个灵活while (*dest)dest++;while ((*dest++ = *src++) != 0) {if (--count == 0) {*dest = '\0';break;}}}return tmp;}int strcmp(const char * cs,const char * ct){register signed char __res;while (1) {if ((__res = *cs - *ct++) != 0 || !*cs++)  //字符串比较break;}return __res;}char * strchr(const char * s, int c){for(; *s != (char) c; ++s)   //从前往后查找字符串中有没有存在的字符if (*s == '\0')return NULL;return (char *) s;}char * strrchr(const char * s, int c){       const char *p = s + strlen(s); <span style="font-family: Arial, Helvetica, sans-serif;"></span>       do {                           //从后往前查找            if (*p == (char)c)               return (char *)p;       } while (--p >= s);       return NULL;}int strlen(const char * s)   {const char *sc;for (sc = s; *sc != '\0'; ++sc)  //计算字符串中有多少个字节/* nothing */;return sc - s;}
//清楚内存区域void * memset(void * s,int c,size_t count){char *xs = (char *) s;while (count--)*xs++ = c;return s;}//内存区域的拷贝void * memcpy(void * dest,const void *src,size_t count){char *tmp = (char *) dest, *s = (char *) src;while (count--)*tmp++ = *s++;return dest;}//类似上面那个void * memmove(void * dest,const void *src,size_t count){char *tmp, *s;if (dest <= src) {tmp = (char *) dest;s = (char *) src;while (count--)*tmp++ = *s++;}else {tmp = (char *) dest + count;s = (char *) src + count;while (count--)*--tmp = *--s;}return dest;}//内存区域比较,有点类似strcmpint memcmp(const void * cs,const void * ct,size_t count){const unsigned char *su1, *su2;int res = 0;for( su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)if ((res = *su1 - *su2) != 0)break;return res;}

运行结果:


慢慢去学着写,绝对让你笔试无压力!!!

0 0
原创粉丝点击