str的各种函数原型strcat、strcpy等
2014-10-03 16:17
330 查看
strcat与strncat原型
////////////////////////////////////////////////////////////////////////// //功能为连接两个字符串,把src连接到dest后面;返回dest地址; ////////////////////////////////////////////////////////////////////////// char* mystrcat(char* dest,const char* src) { assert((dest != NULL) && (src != NULL)); char* res = dest; while(*dest) // *dest != '\0' { dest++; } while(*dest++ = *src++) { NULL; } return res; }
/* //功能为连接两个字符串,把src连接到dest后面;返回dest地址; */ char* mystrncat(char* dest,const char* src,unsigned int num) { assert((dest != NULL) && (src != NULL)); if (!num) { return dest; } char* res = dest; while(*dest) // *dest != '\0' { dest++; } while(*dest++ = *src++) { if (--num == 0) { *dest = '\0'; break; } } return res; }
strchr与strrchr原型
////////////////////////////////////////////////////////////////////////// //功能为查找str中首次出现c的位置,如有有,则返回出现位置,否则返回NULL; ////////////////////////////////////////////////////////////////////////// /* const char * strchr ( const char * str, int character ); char * strchr ( char * str, int character ) */ char* mystrchr(char* str,char c) { assert(str != NULL); while(*str && *str != c) { str++; } if (*str == c) return str; return NULL; }
////////////////////////////////////////////////////////////////////////// //功能为查找str中最后一次出现c的位置,如有有,则返回出现位置,否则返回NULL; ////////////////////////////////////////////////////////////////////////// char* mystrrchr(char* str,char c) { assert(str != NULL); char* res = str; while(*res++) ; while((--res != str) && (*res != c)) ; if (*res == c) return res; return NULL; }
strcmp与strncmp原型
////////////////////////////////////////////////////////////////////////// //功能为比较两个字符串; //当str1指向的字符串大于str2指向的字符串时,返回正数。 //当str1指向的字符串等于str2指向的字符串时,返回0。 //当str1指向的字符串小于str2指向的字符串时,返回负数。; ////////////////////////////////////////////////////////////////////////// int mystrcmp(const char* str1,const char* str2) { assert((str1 != NULL) && (str2 != NULL)); while (*str1 && (*str1 == *str2)) { str1++; str2++; } return *str1-*str2; }
////////////////////////////////////////////////////////////////////////// //功能为比较两个字符串前num个字符; //当str1指向的字符串大于str2指向的字符串时,返回正数。 //当str1指向的字符串等于str2指向的字符串时,返回0。 //当str1指向的字符串小于str2指向的字符串时,返回负数。; ////////////////////////////////////////////////////////////////////////// int mystrncmp(const char* str1,const char* str2,unsigned int num) { assert((str1 != NULL) && (str2 != NULL)); if (!num) return 0; while (--num && *str1 && (*str1 == *str2)) { str1++; str2++; } return *str1-*str2; }
strcpy与strncpy原型
/* 功能为拷贝字符串内容到目的串,把src所指向的内容拷贝到dest; */ char* mystrcpy(char* dest,const char* src) { assert((dest != NULL) && (src != NULL)); char* res = dest; while(*dest++ = *src++) { NULL; } return res; }
/* 功能为拷贝字符串内容到目的串,把src所指向的内容的前num个字符拷贝到dest; 标准库中返回指针不是以null即'\0'结束的,必须手动添加 */ char* mystrncpy(char* dest,const char* src,unsigned int num) { assert((dest != NULL) && (src != NULL)); if (!num) { *dest = '\0'; return dest; } char* res = dest; while(*dest++ = *src++) { if (--num == 0) { *dest = '\0'; break; } } return res; }
strspn与strcspn原型
////////////////////////////////////////////////////////////////////////// //功能:在字符串str1中搜寻str2中所出现的字符 //说明:返回第一个出现的字符在s1中的下标值 //亦即在s1中出现而s2中没有出现的子串的长度; ////////////////////////////////////////////////////////////////////////// unsigned int mystrcspn ( const char * str1, const char * str2 ) { assert((str1 != NULL) && (str2 != NULL)); // map有32个字节的大小,也就是256个bit,可把map堪称一个2维数组[32][8] unsigned char map[32] = {0}; // 每个ASCII码(设为c)有8bit,把它分成2部分,低3位构成下标j(通过c&7(2进制为111)); // 高5位构成下标i(通过c>>3得到)。这样在map[i][j]中置1表示字符存在; while(*str2) { map[*str2 >> 3] |= (unsigned int)(1 << (*str2 & 7)); str2++; } map[0] |= 1; unsigned int count = 0; while(!(map[*str1 >> 3] & (unsigned int)(1 << (*str1 & 7)))) { count++; str1++; } return count; }
//返回字符串中第一个不在指定字符串中出现的字符下标 //亦即第一个在s1中出现且s2中存在的子串的长度; unsigned int mystrspn(char* str1,char* str2) { assert((str1 != NULL) && (str2 != NULL)); // map有32个字节的大小,也就是256个bit,可把map堪称一个2维数组[32][8] unsigned char map[32] = {0}; // 每个ASCII码(设为c)有8bit,把它分成2部分,低3位构成下标j(通过c&7(2进制为111)); // 高5位构成下标i(通过c>>3得到)。这样在map[i][j]中置1表示字符存在; while(*str2) { map[*str2 >> 3] |= (unsigned int)(1 << (*str2 & 7)); str2++; } map[0] |= 0; unsigned int count = 0; while((map[*str1 >> 3] & (unsigned int)(1 << (*str1 & 7)))) { count++; str1++; } return count; }
strlen原型
////////////////////////////////////////////////////////////////////////// //功能为返回字符串str的长度(不包括'\0'); //size_t strlen ( const char * str ); ////////////////////////////////////////////////////////////////////////// unsigned int mystrlen(const char* str) { assert(str != NULL); unsigned int len = 0; while(*str++) { len++; } return len; }
strstr原型
//需找str字符串中出现strSearch字符串位置的指针。如果没找到,则返回NULL,如果strSearch为空,则返回str; char* mystrstr(char* str,char* strSearch) { /* int length1=strlen(str); int length2=strlen(strSearch); while(length1>=length2) { length1--; if(!mystrncmp(str,strSearch,length2))//比较前n个字符串; return str; str++; } return NULL; */ char* b = strSearch; if( *b == NULL ) { return str; } char* a = NULL; for( ; *str != NULL; str++) { if( *str != *b ) { continue; } a = str; while(1) { if( *b == NULL ) { return str; } if( *a++ != *b++ ) { break; } } b = strSearch; } return NULL; }
strpbrk
//在源字符串(str1)中找出最先含有搜索字符串(str2 )中的任一字符的位置并返回,若找不到则返回空指针; //与mystrnspn的算法一样,只是前者返回相同字符的指针位置,后者返回相同字符的个数; char* mystrpbrk(char* str1,char* str2) { assert((str1 != NULL) && (str2 != NULL)); // map有32个字节的大小,也就是256个bit,可把map堪称一个2维数组[32][8] unsigned char map[32] = {0}; // 每个ASCII码(设为c)有8bit,把它分成2部分,低3位构成下标j(通过c&7(2进制为111)); // 高5位构成下标i(通过c>>3得到)。这样在map[i][j]中置1表示字符存在; while(*str2) { map[*str2 >> 3] |= (unsigned int)(1 << (*str2 & 7)); str2++; } map[0] |= 1; while(*str1) { // 如果有相同的字符则返回; if( map[*str1 >> 3] & (1 << (*str1 & 7)) ) return str1++; str1++; } return NULL; }
经过一天的奋斗,终于将这些理清楚了。再接再厉!
这些经常出现在面试题中,不能再输在这上面了
相关文章推荐
- C语言面试必须会的几个字符串操作函数原型strcpy,strcmp,strlen,strcat
- 字符串操作strlen,strcpy,strcat的函数原型
- 已知strcpy的函数原型:char *strcpy(char *strDest, const char *strSrc)其中strDest 是目的字符串,strSrc 是源字符串。不调用C++/C
- strcpy strcmp strcat 函数原型
- strlen,strcpy,strcat,strcmp四个函数的原型,memcpy,memset的实现
- [转载] 已知strcpy的函数原型:char *strcpy(char *strDest, const char *strSrc),编写函数 strcpy(C++版)
- strcpy和strcat的函数原型
- strlen,strcpy,strncpy,strcmp,strcat,strstr的用法,函数原型及函数的实现
- mem系列函数(memset memcpy memmove) 和str系列函数(strlen strcpy strcmp strcat strstr strtok)
- 字符串操作函数Strcat、Strcpy、Strcmp、Strlen原型
- Strcat /Strcpy /Strcmp / Strncmp/ Strlen 函数原型
- 重写strcpy() 函数原型
- strcpy,strcat, strcmp, atoi, itoa函数原型实现
- 用C语言写出strcpy和strlen的函数的原型
- strcpy; strcmp; strlen; strcat 函数实现
- strcpy的函数原型
- C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文
- 纯C 字符串操作函数 实现 (strcpy, strncpy, memcpy, memset, strcat, strlen ... )
- strcat,strcpy,strcmp,strlen4个常用字符串处理函数的数组与指针简单实现方法~
- C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文