- 浏览: 128665 次
- 性别:
- 来自: 成都
最新评论
-
yi_chao_jiang:
你好,多谢分享,问个问题,在上传数据的时候判断文件是否有上传记 ...
断点续传和下载原理分析 -
a41606709:
为什么我的tabhost显示不出来? 怎么设置在全部页面中让他 ...
TabActivity中的Tab标签详细设置 -
Zero颴:
大神篇,思路,配图都很清晰,perfect!
Android事件模型之interceptTouchEvnet ,onTouchEvent关系正解 -
QAZ503602501:
牛死人了!!!
B-树 -
mengsina:
很牛的文档。数学功底好啊
Android Matrix理论与应用详解
1.常见的字符串操作
如计算长度,求子串等都是考验基本功的,现在基本操作进行实现,如下
2.基本实现
mchar.h
//串的基本操作(注意:里面的所有操作要求串必须以'\0'结束) #ifndef MCHAR_H #define MCHAR_H //注意:这里面的i都是位置,从1开始;而数组中对应于0,从0开始 class MChar{ public: int strLen(const char *s); //串长度(在输入串的时候,必须以'\0'结束) char* strCpy(char* s,const char* p); //串拷贝,p拷贝给s,原来的值被覆盖 char* strCat(char* s, const char* p);//串连接,将p连接到s后面 char* subStr(char* s, int i, int len);//求从第i个位置开始的长度为len的子串 int strCmp(const char* s, const char* p); //串比较(s==p, return=0; s>p, return>0; else <0) int strIndex(const char* s, const char* p); //子串定位(p若属于s,返回串p在s中的位置,否则返回0) void strInsert(char* s, int i, const char* p);//将串p插入到串s的第i个字符开始的位置上 void strDelete(char* s, int i, int len);//删除串s中从第i个字符开始的长度为len的子串 int findStr(const char* s, int ch); //查找为ch的字符 const char *toUpper(char *s); //将所有小写字符转换为大写 void itoaTest(int num, char str[]); //整数转换为字符串 int atoiTest(char s[]); //字符串转换成整数atoi函数 bool isPalindrome(char *s); //判断输入的是否是一个回文字符串 void printStr(char* s); }; #endif
mchar.cpp
#include <iostream> #include <cstring> #include <assert.h> #include "mchar.h" using namespace std; //串长度(在输入串的时候,必须以'\0'结束) int MChar::strLen(const char *s){ if(!s) throw "串不能为空!\n"; int i=0; while(*s != '\0'){ i++; s++; } return i; } //串拷贝,p拷贝给s,原来的值被覆盖 char* MChar::strCpy(char* s,const char* p){ if(!s || !p) throw "串不能为空!\n"; char *address = s; //改进1,简洁 //while(*p != '\0') *s++ = *p++; while((*s++ = *p++) != '\0'); //改进2:去掉它*s = '\0'; //改进3:增加返回值,返回最新的s地址,方便链式操作 return address; } //串连接,将p连接到s后面 char* MChar::strCat(char* s, const char* p){ if(!s || !p) throw "串不能为空!\n"; while(*s != '\0') *s++; while(*p != '\0') *s++ = *p++; *s = '\0'; return s; } //求从第i个位置开始的长度为len的子串 char* MChar::subStr(char* s, int i, int len){ if(!s) throw "串不能为空!\n"; int l = strLen(s); if(i<1 || i>l || i+len-2>l) throw "参数越界异常!\n"; int j=1; char* t = s; while(j != i && *s != '\0'){ j++; *s++; } while(*s != '\0' && len > 0) { len--; *t++ = *s++; } *t = '\0'; return t; } //串比较(s==p, return=0; s>p, return 1; else -1) int MChar::strCmp(const char* s, const char* p){ if(!s || !p) throw "串不能为空!\n"; while(*s != '\0'){ if(*s++ == *p++) continue; else if(*s++ > *p++) return 1; else return -1; } if(*s == '\0' && *p == '\0') return 0; else return -1; } //将串p插入到串s的第i个字符开始的位置上,假设s的长度足够长,不会溢出 void MChar::strInsert(char* s, int i, const char* p){ if(!s && !p) throw "串不能为空!\n"; int len = strLen(s); int len2 = strLen(p); if(i<1 || i>len+1) throw "参数越界异常!\n"; int j=0; //不是j=len-1开始,因为要把'\0'也移动到后面 for(j=len; j>=i-1; j--){ s[len2+j] = s[j]; } for(j=0; j<len2; j++){ s[i+j-1] = p[j]; } } //删除串s中从第i个字符开始的长度为len的子串 void MChar::strDelete(char* s, int i, int len){ if(!s) throw "串不能为空!\n"; int l = strLen(s); if(i<1 || i>l || i+len-1> l) throw "参数越界异常!\n"; for(int j=i+len-1; j<=l; j++){ s[j-len] = s[j]; } } //查找为ch的字符 int MChar::findStr(const char* s, int ch){ if(!s) throw "串不能为空!\n"; int i=1; while(*s != '\0'){ if(*s == (char)ch) return i; s++; i++; } return 0; } //子串定位(p若属于s,返回串p在s中的位置,否则返回0) int MChar::strIndex(const char* s, const char* p){ if(!s || !p) throw "串不能为空!\n"; int i=0, j=0, r = 1; int sl = strLen(s); int pl = strLen(p); if(sl < pl) throw "参数异常,串长度!\n"; while(i<sl && j<pl){ if(s[i] == p[j]){ i++; j++; }else{//恢复开始的位置的下一个位置 i = i-j+1; j = 0; } } if(j >= pl) r = i-pl+1; else r = -1; return r; } void MChar::printStr(char* s){ if(!s) throw "串不能为空!\n"; while(*s != '\0') cout<<*s++<<" "; cout<<endl; } const char* MChar::toUpper(char *s){ if(!s) throw "串不能为空!\n"; int l = 'a' - 'A'; cout<<l<<endl; while(*s != '\0'){ if(*s>= 'a' && *s<='z') *s = *s - l; s++; } return s; } //整数转换为字符串 void MChar::itoaTest(int num, char str[]){ int n = num, i, k; char tmp[20];//假设不会发生溢出 if(num < 0) n = -n; for(k=0; n>0; k++){ i = n % 10; tmp[k] = i + '0';//'0'-->48, '0'+1==49-->'1' n = n / 10; } //反向 if(num < 0) tmp[k] = '-'; else k--; for(i=0; k >= 0; i++){ str[i] = tmp[k--]; } str[i] = '\0'; } //字符串转换成整数atoi函数(关键是注意,特殊字符的判断,前面的+-等) /**注意四点: *1.整数以谁开头,‘+’,‘-’或者空格,要判断; *2.如果输入字符串是指针,首先判断是否为空; *3.输入字符串可能含非数字字符,如果含果断结束; *4.最后得到的整数特别大,可能溢出 */ int MChar::atoiTest(char s[]){ int sign = 1, tmp = 0, i = 0; //判断前面是否有空格,回车等 while(' '==s[i]||'\t'==s[i]) i++; //符号判断 if(s[i]=='-'){ i++; sign = -1; }else if(s[i]=='+'){ i++; sign = 1; } while(s[i] != '\0'){ //对于非数字,直接结束 if(s[i] < '0' || s[i] > '9') throw "含有非数字字符!"; //或者使用断言代替throw,不过throw更好,他能提供具体原因,这个可以自己指定,方便找到原因 //assert(s[i] >= '0'); assert(s[i]<= '9'); tmp = tmp*10 + s[i]-'0'; //处理溢出 if(tmp < 0) throw "整数过大溢出!"; //assert(tmp >= 0); i++; } return sign*tmp; } //判断输入的是否是一个回文字符串 bool MChar::isPalindrome(char *s){ char input[100]; strcpy(input, s); int length = strlen(input); int begin = 0,end = length-1; while(begin<end) { if(s[begin]==s[end]){ begin++; end--; }else{ break; } } if(begin<end) return false; else return true; }
main.cpp
#include <iostream> #include <cstring> #include "mchar.h" using namespace std; int main(){ MChar mc; char a[] = {'h','e','l','l','o','j','l','l','k','\0','o','o','o','o','o','o','o','o','o'}; char b[] = {'g','m','\0'}; char c[] = {'l','L','0','t','K','\0'}; try{ /* mc.printStr(a); cout<<"串长度:"<<mc.strLen(a)<<endl; cout<<"串拷贝:"; char* s = new char[6]; mc.strCpy(s, c); mc.printStr(s); delete s; cout<<"\n串连接:"; mc.strCat(a, b); mc.printStr(a); cout<<"\n子串截取:"; char* m = mc.subStr(a, 1, 4); if(m) mc.printStr(a); cout<<"\n串比较:"; cout<<mc.strCmp(c, a)<<endl; cout<<"串插入:"; mc.strInsert(a, 7, b); mc.printStr(a); cout<<"串删除:"; mc.strDelete(a, 5, 7); mc.printStr(a); cout<<(int)'e'<<endl; cout<<"查找字符:"; cout<<mc.findStr(a, 101)<<endl; cout<<"子串位置:"; cout<<mc.strIndex(a, c)<<endl; cout<<"大写转换:"; mc.toUpper(c); mc.printStr(c); cout<<"整数转换为字符串:"; char* t = new char[20]; mc.itoaTest(324344445, t); mc.printStr(t); cout<<(char)(3+'0')<<" "<<(int)'0'<<endl;//输出3 48 cout<<"字符串转换为整数:"; char t[] = {' ','-','3','4','5','2','9','\0'}; cout<<mc.atoiTest(t)<<endl; cout<<'3'-'0'<<endl; */ cout<<"回文字符串判读:"; char s[20] ="1234554321"; if(mc.isPalindrome(s)) { cout<<"True"<<endl; }else{ cout<<"Fasle"<<endl; } }catch(char const *s){ cout<<s<<endl; } return 0; }
3.几个操作
#include <iostream> #include <cstring> using namespace std; bool isDigit(const char ch){ if(ch >= '0' && ch <= '9') return true; return false; } //计算连续数字的个数,如ak123x5612393837?3043gef435,将其存入数组a中a[] = {123,56,123,43,43} int countInt(const string s, string* result){ int count = 0; //查找到的字符串个数 int i=0,temp=11; //temp暂存,上一个数字(注:数字是从0~9故而这里设为11) string str = ""; //临时存储,递增字符串(如123,54) const char* c = s.c_str(); //转换为char数组 while(i < s.size()){ char a = c[i]; //-----------------循环处理连续数字字符串-------------------------------------- //判读是不是数字,如果是数字则要循环判段是否顺序递增或递减 while(isDigit(a)){ int k = a-'0'; if(str.size() == 0){ //1.如果刚开始,就直接添加到str str.append(sizeof(char),a); }else if(k == temp+1 || k == temp-1){ //2.如果不是第一个,而且是下一个数字,则添加到str str.append(sizeof(char),a); }else if(str.size() == 1){ //3.如果既不是第一个也不是连续的数组,置空并重新开始往str添加,注:顺序不能变,代表了判读的顺序 //restart again str = ""; str.append(sizeof(char),a); }else{ //4.如果str个数>1,而后面也没有连续的数字了,就放入result数组,并重新继续开始往str添加 *result++ = str; count++; //restart again str = ""; str.append(sizeof(char),a); } a = c[++i]; if(!isDigit(a)){ //如果非数字,看是否满足放入result的条件,如果满足存入,否则跳出循环 if(str.size() > 1){ *result++ = str; count++; str = ""; temp = 11; } break; } temp = k; } i++; } return count; } //求最长重复子串 int longestString(const string str){ const char* s = str.c_str(); int n = str.size(); int index = 0, max = 0; int length = 1, i=0,start=0; while(i<n-1){ if(s[i] == s[i+1]){ length++; }else{ if(max < length){ max = length; index = start; } length = 1; start = i; } i++; } cout<<"最长子串长度为:"<<max<<", 位置:"<<index+1<<endl; return max; } bool isSign(const char ch){ if(ch == ',' || ch == '.' || ch == '?' || ch == '!' || ch == '"' || ch == '\'' || ch == '-' || ch == ' ') return true; return false; } bool isSpicial(const char ch){ if((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9')) return false; return true; } //(文章的处理)将字符串中的特殊字符用空格代替(假设现在只含有,.?"!'-),若是多个空格,则用一个空格代替 void clearString(string str, char* result){ const char* s = str.c_str(); int len = str.size(), temp = 0; for(int i=0; i<len; i++){ if(!isSpicial(s[i])){ //如果是字母或数字不处理 *result++ = s[i]; }else{ //如果是特殊字符则跳过 while(i<len && isSpicial(s[i])){ i++; } //特殊字符以空格取代 *result++ = ' '; i--;//减去一个,因为for循环开始循环之前要i++ } } } int main(){ /* string s = "ak123x5612d393837?3043gef435"; string* a = new string[s.size()]; int count = countInt(s,a); cout<<count<<endl; for(int i=0; i<count; i++){ cout<<a[i]<<" "; } cout<<endl; delete[] a; //最长子串 string m = "4444fdasdfdrekkkkkkkkfdeeesfs"; longestString(m); */ string k = "What is it? she asked joyfully. Scarlett! 43 44 55ffg She was: Bitterly disappointed."; char* result = new char[k.size()]; clearString(k, result); for(int i=0; i<k.size(); i++){ cout<<result[i]; } cout<<endl; delete[] result; return 0; }
发表评论
-
排序方法总结
2012-08-12 11:34 1132这里面包含了所有常见的排序操作 1.性能等比较分析 2 ... -
KMP算法解析
2012-08-12 11:35 2774一.理论基础 1.什么 ... -
二叉堆的实现
2012-08-12 11:35 11741.堆的概念 这里只需要注意两点: a.堆的存储方式:就是 ... -
set和map的简单实现
2012-08-10 11:35 12761.Set的简单实现 set是利用二叉查找树来实现的,而且为 ... -
红黑树的插入总结
2012-08-10 11:25 9071.红黑树 这个在july的博客中有详尽的说明,我就不在赘述 ... -
B-树实现
2012-08-10 11:03 15871.什么是B-树? 这个在我的前一篇博客中已经详细的阐释过: ... -
平衡二叉树
2012-08-10 10:39 27941.问题描述 什么是平衡 ... -
二叉排序树
2012-08-10 10:25 14171.基本概念 二叉排 ... -
B-树
2012-07-04 22:48 56101.B-树的概念 是一种多 ... -
构造哈夫曼树
2012-07-04 10:40 11871.算法说明 就是建造哈夫曼树树,从而使得构造出的树带权路径 ... -
线索二叉树
2012-07-04 09:20 12371.算法描述 就是简单的线索二叉树的建立,遍历,查找等基本操 ... -
二叉树基本操作大全
2012-07-03 18:22 25541.二叉树的基本操作 这里我有一个疑问: 在使用构造 ... -
多种队列的实现
2012-06-29 10:09 14921.算法描述 a.数据结构与算法(Mark Allen We ... -
栈的各种实现
2012-06-28 16:34 10751.算法描述 a.实现二个栈,在一个数组里面,除非没有任何空 ... -
中缀表达式转换为后缀
2012-06-28 11:10 17511.算法描述 例如a+b*c这是常见的中缀表达式,但是 ... -
后缀表达式的值
2012-06-27 16:33 12891.算法描述 计算后缀表达式的值 2.事例 如:( ... -
Josephus问题
2012-06-21 15:30 9531.算法描述 简单的游戏:有N个人坐成一圈,编号1-N、从编 ... -
关于最长递增子序列的实际应用--动态规划
2012-06-07 11:35 1788参考链接: a.http://www.programfan. ... -
线性查找二维数组
2012-06-05 17:23 9991.算法描述 有序(行有序,列有序,且每行从左至右递增 ... -
整数的随机置换
2012-06-05 15:10 2231算法描述:生成前N个整 ...
相关推荐
JavaScript中常见的字符串操作函数及用法,详细说明JS中字符串的操作函数
字符串常见操作
总结了C++中常见的字符串操作函数,是大家在编程中会常遇到的
python的一些字符串的不常见操作哦!相信大家都用惯了那些常见的字符串操作,想学一些不常见,但是有可能用得到的操作吧!看这里,你值得拥有
常见的C字符串处理函数的源代码, 面试必备啊。
主要介绍了VBS中常见字符串操作函数,需要的朋友可以参考下
利用C语言库函数实现常见的字符串操作.pdf
# MATLAB数组字符串的意义,常见的操作解析 在MATLAB中,数组是一种非常重要的数据类型。数组可以包含任意数量的元素,这些元素可以是数值、字符、逻辑值等。数组在MATLAB中非常常见,因为它们可以用来表示矩阵、...
本文实例讲述了PHP常见字符串操作函数与用法。分享给大家供大家参考,具体如下: 一、字符串的格式化 1、字符串的格式化 trim()函数可以去除字符串的开始位置和结束位置的空格,并将结果字符串返回,默认情况下去除...
给大家分享10中java常见字符串操作方法以及相关实例代码,对此有需要的读者们可以学习参考下。
字符串操作是在编程中对字符串进行处理和操作的常见任务。以下是一些常规的字符串操作: 1. 连接字符串(Concatenation):将两个或多个字符串连接在一起,形成一个新的字符串。在大多数编程语言中,可以使用加号 ...
包含面试中经常考的数据结构,算法以及字符串的操作等常见的面试问题,经典解答
逆序字符串是指将原始字符串的字符顺序颠倒过来的操作。例如,如果原始字符串是 "Hello",则它的逆序字符串就是 "olleH"。 逆序字符串可以通过多种方式实现,其中一种常见的方法是使用循环和临时变量。具体步骤如下...
以下是Objective-C中创建和操作字符串的一些常见方法: 创建字符串: NSString *str1 = @"Hello, World!"; // 使用@"..."语法创建字符串常量 NSString *str2 = [NSString stringWithFormat:@"The value is %d", 42]...
个人积累的Java工具类扩展类,包括字符数组转字符串,质数判断,辗转相除法求最大公约数,对字符串的一些判断,几种常见的数组排序、插入、查找等,闰年判断 日期字符串解析等与日期有关的操作,随机字符串。...
[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行] 搜索字符串 查找字串在字符串中的位置 Str.indexOf(subStr) Str代表指定的字符串 subStr表示要搜索的子串 查找指定位置字符 使用str.charAt(n) str 代表要被搜索的...
C#字符串常见操作总结详解(1)取字符串长度 <string>.Length;(2)字符串转为比特码 GetBytes()(3)字符串相加 推荐StringBuilder sb = new StringBuilder();sb.Append();(4)截断字符串的一部分 变量....
4.6 Python核心基础知识之字符串常见的操作.mp4
主要介绍了python常见字符串处理函数与用法,结合实例形式详细分析了Python字符串操作函数find、join、replace及split功能、使用技巧与操作注意事项,需要的朋友可以参考下