(4)字符串处理

来源:互联网 发布:数据库读写分离方案 编辑:程序博客网 时间:2024/06/04 23:29
#include <iostream>#include <string>using namespace std;void TestStringThings();void TestNULL();/* *给定一个字符串A,在A中找一个字符串B *例如:A:ABCDEFB:CD *return 起始位置。如果不存在,返回-1 */int StrStr(const char *str1, const char *str2);// KMP算法/* * 在字符串中,找到第一个只出现一次的字符 * abaccdeff,返回b * 默认都是小写字母 */// 可以用bool[26]:当出现一次时,设置为true,再出现时,设为false// 最后再扫描一遍输出第一个char FindFirstOfOnce(const char *str);// 可以讲str排序,然后扫描输出第一个单独出现的...// 不好!!!这样就打乱了原顺序.../* * strcpy(dest, source) * char * strcpy(char *dest, const char *source); * 这里之所以返回char*,是为了可以进行链操作:strlen(strcpy(dest, source)); */char * MyStrCpy_2(char *dest, const char *source);// 最多拷贝count个字符char *MyStrNCpy(char *dest, const char *src, unsigned count);int FindFirstCharOfStr(const char *str, char c);// strcmp:比较两个字符串// -101int MyStrCmp(const char *s1, const char *s2);int MyStrCmp_2(const char *s1, const char *s2);int MyStrCmp_3(const char *s1, const char *s2);// strncmpint MyStrNCmp(const char *s1, const char *s2, unsigned n);// strcat// Appends a copy of the source string to the destination stringchar *MyStrCat(char *dest, const char *src);// strncat// Appends a copy of the source string to the destination string, 最多nchar *MyStrNCat(char *dest, const char *src, int n);// strlenunsigned MyStrLen(const char *str);// strdup// 传入一个字符串,复制一个新的字符串,并返回首地址char *MyStrDup(const char *src);// 返回s2在s1中出现的首位址,如果不出现,则返回NULLchar *MyStrStr_3(const char *s1, const char *s2);// strpbrk(str1, str2)// 在str1中首次出现str2的字母的位置// str1:abcdestr2:ca// 返回 c位置char *MyStrPBrk(const char *str1, const char *str2);// strcspn()// 在str1中首次出现str2的字母距离str1的首位址,例如上面的返回2// strchr:查找c在str中首次出现的位置char * MyStrChr(const char *str, int c);// strrchr :查找c在str中最后出现的位置char * MyStrRChr(const char *str, int c);// strspn:查找在str1中全部都在str2中的字符个数// str1:"129th";// str2:"1234567890";// 3unsigned MyStrSpn(const char *str1, const char *str2);// 翻转字符串char * MyStrRev(char *str);// strnset// 将str前n个设置为cchar *MyStrNSet(char *str, int c, unsigned n);char *MyStrSet(char *str, int c);// 由于从第二次调用开始,str传入NULL,因此需要一个静态变量来// 保存当前处理的位置char *MyStrTok(const char *str, const char *delim);// strupr// 将其转化为大写char *MyStrUpper(char *str);char *MyStrLower(char *str);// memcpy()void MyMemCpy(char *dest, const char *src, unsigned count);

#include <assert.h>#include "4_StringThings.h"void TestStringThings(){/*char str1[] = "ABCDEF";char str2[] = "CD";cout << StrStr(str1, str2) << endl;char str3[] = "CF";cout << StrStr(str1, str3) << endl;*/// TestNULL();char str1[] = "ABC";char str2[] = "AB";char str3[] = "ABC";char str4[] = "ABCD";cout << MyStrCmp_3(str1, str2) << endl;cout << MyStrCmp_3(str1, str3) << endl;cout << MyStrCmp_3(str1, str4) << endl;}void TestNULL(){/*char *arr = "ab";char *p = arr;unsigned len = 0;while (*p++){len++;}assert(len == 2);len = 0;p = arr;while (*p++ != '\0'){len++;}assert(len == 2);*/// '\0'的ascii是0char c = 'a';cout << (int)c << endl;int res = c - '\0';cout << res << endl;}int StrStr(const char *str1, const char *str2){assert(str1 != NULL);assert(str2 != NULL);unsigned len1 = strlen(str1);unsigned len2 = strlen(str2);unsigned len = len1 - len2;for (unsigned i = 0; i < len; ++i){if (*(str1 + i) == *(str2)){bool found = true;for (unsigned j = 1; j < len2; ++j){if (*(str1 + i + j) != *(str2 + j)){found = false;break;}}if (found){return i;}}}return -1;}char FindFirstOfOnce(const char *str){assert(str != NULL);bool flags[26] = {false};char *p = const_cast<char *>(str);while (*p){unsigned index = *p - 'a';flags[index] = !flags[index];p++;}// 遍历,找出第一个while (*str){if (flags[*str - 'a']){return *str;}str++;}return '\0';}// 这里已经假设dest的空间足够大!!!// 而且两者没有重叠的空间!!!char * MyStrCpy_2(char *dest, const char *source){assert(dest != NULL && source != NULL);char *addr = dest;while (*dest++ = *source++);return addr;}char *MyStrNCpy(char *dest, const char *src, unsigned count){assert(dest != NULL && src != NULL);char *addr = dest;while (count-- && (*dest++ = *src++));// 1. 有可能src不到count,这时候不需要补'\0',这时候*src为'\0'// 2. src长度大于count,这时候要补'\0'if (*src != '\0'){*dest = '\0';}return addr;}// 查找字符串s中首次出现字符c的位置int FindFirstCharOfStr(const char *str, char c){assert(str != NULL);char *p = const_cast<char *>(str);while (*p){if (*p == c){return (p - str);}p++;}return -1;}int MyStrCmp(const char *s1, const char *s2){assert(s1 != NULL && s2 != NULL);// 1.找出第一个两者不相同的位置// 2.如果次数两者都结束:0// 3.如果有一个结束:// 4.如果两者都不结束while ((*s1 != '\0') && (s2 != '\0') && (*s1++ == *s2++));if (s1 == '\0' && s2 == '\0'){return 0;}else if (s1 != '\0' && s2 != '\0'){return int(*s1 - *s2);}else{if (s1 == '\0'){return -1;}else{return 1;}}}int MyStrCmp_2(const char *s1, const char *s2){assert(s1 != NULL && s2 != NULL);// 1.找出第一个两者不相同的位置// 2.如果次数两者都结束:0// 3.如果有一个结束:// 4.如果两者都不结束while (*s1 && *s2 && (*s1++ == *s2++));return *s1 - *s2;}int MyStrCmp_3(const char *s1, const char *s2){// 如果两者都为NULL,是否返回0?// assert(s1 && s2);int res = 0;// 这里为何要转换成unsigned char ???//while ( !(res = (*(unsigned char *)s1 - *(unsigned char *)s2)) && *s1)while ( !(res = (*s1 - *s2)) && *s1){s1++;s2++;}if (res < 0)return -1;if (res > 0)return 1;return res;}// dest、src不能有重叠区域char *MyStrCat(char *dest, const char *src){assert(dest != NULL && src != NULL);char *addr = dest;while (*dest++);while (*dest++ = *src++);return addr;}unsigned MyStrLen(const char *str){assert(str != NULL);unsigned len = 0;while (*str++){len++;}return len;}char *MyStrDup(const char *src){assert(src);unsigned len = 0;char *p = const_cast<char *>(src);while (*p++){len++;}char *dest = new char[len + 1];char *addr = dest;while (*dest++ = *src++);return addr;}char *MyStrStr_3(const char *s1, const char *s2){assert(s1 != NULL && s2 != NULL);unsigned len1 = strlen(s1);unsigned len2 = strlen(s2);if (len1 < len2){return NULL;}unsigned len = len1 - len2;for (unsigned i = 0; i < len; ++i){bool found = true;for (unsigned j = 0; j < len2; ++j){if (*(s1 + i) != *(s2 + j)){found = false;break;}}if (found){return (const_cast<char *>(s1) + i);}}return NULL;}char *MyStrNCat(char *dest, const char *src, int n){assert(dest != NULL && src != NULL);char *addr = dest;while (*dest++);while (n-- && (*dest++ = *src++));return addr;}int MyStrNCmp(const char *s1, const char *s2, unsigned n){assert(s1 && s2);while (n-- && (*s1++ == *s2++));return (*s1 - *s2);}char *MyStrPBrk(const char *str1, const char *str2){assert(str1 && str2);while (*str1){char *p = const_cast<char *>(str2);while (*p){if (*p++ == *str1){return const_cast<char *>(str1);}}str1++;}return NULL;}char * MyStrChr(const char *str, int c){assert(str);while (*str){if (*str == c){return const_cast<char *>(str);}str++;}return NULL;}char * MyStrRChr(const char *str, int c){assert(str);char *p = const_cast<char *>(str);while (*p++);p--;while (*p != c){p--;}if (p == str){return NULL;}return p;}unsigned MyStrSpn(const char *str1, const char *str2){unsigned num = 0;while (*str1){char *p = const_cast<char *>(str2);while (*p){if (*str1 == *p){num++;break;}p++;}str1++;}return num;}/*a 与 b交换:a = a ^ bb = a ^ ba = a ^ b*/char * MyStrRev(char *str){char *start = str;char *end = str;while (*end++);end--;while (start != end){*start = *start ^ *end;*end = *start ^ *end;*start = *start ^ *end;start++;end--;}return str;}char *MyStrNSet(char *str, int c, unsigned n){assert(str);char *addr = str;while (n-- && *str){*str = (char)c;str++;}return addr;}char *MyStrSet(char *str, int c){assert(str);char *addr = str;while (*str){*str = (char)c;str++;}return addr;}char *MyStrTok(char *str, const char *delim){assert(delim);static char *next;if (str){next = str;}char *addr = next;char *pStr = next;while (*pStr){char *pdelim = const_cast<char *>(delim);while (*pdelim){if (*pStr == *pdelim){next = pStr + 1;*pStr = '\0';return addr;}pdelim++;}pStr++;}return NULL;}char *MyStrUpper(char *str){assert(str);char *addr = str;char c = *str;while (c){if ('a' <= c && c <= 'z'){*str -= 0x20;c = *(++str);}}return addr;}char *MyStrLower(char *str){assert(str);char *addr = str;char c = *str;while (c){if ('A' <= c && c <= 'Z'){*str += 0x20;c = *(++str);}}return addr;}// 主意:要首先分配dest的内存空间!void MyMemCpy(char *dest, const char *src, unsigned count){assert(src);unsigned len = 0;const char *p = src;while (*p++){len++;}dest = new char[len + 1];while (count-- && (*dest++ = *src++));}


原创粉丝点击