C++中的字符串类(二十七)-创新互联
在 C 语言中是不支持真正意义上的字符串,是用字符数组和一组函数来实现字符串操作的。同样,在 C 语言中不支持自定义类型,因此无法获得字符串类型。那么从 C 到 C++ 的进化过程引入了自定义类型,在 C++ 中可以通过类来完成字符串类型的定义。那么问题来了,C++ 中的原生类型系统是否包含字符串类型呢?
创新互联主要从事成都网站建设、网站制作、网页设计、企业做网站、公司建网站等业务。立足成都服务西安,10多年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18982081108C++ 语言直接支持 C 语言的所有概念,在 C++ 语言中没有原生的字符串类型。但是在 C++ 标准库中提供了 string 类型:a> string 直接支持字符串连接;b> string 直接支持字符串的大小比较;c> string 直接支持子串查找和提取;d> string 直接支持字符串的插入和替换。
下来我们就来看看在 C++ 中的字符串类的使用
#include#include using namespace std; void string_sort(string a[], int len) { for(int i=0; i a[j] ) { swap(a[i], a[j]); } } } } string string_add(string a[], int len) { string ret = ""; for(int i=0; i 我们实现的第一个函数是字符串的排序,按照首字母进行排序。我们可以看到 string 可以直接支持 > 号,并且也提供了 swap 函数,内部的 > 肯定使用了操作符重载。第二个函数是实现字符串的连接,直接用 + 号进行连接,不用说,这里肯定也实现了操作符的重载。我们来看看编译结果
我们看到已经成功实现。下来我们看看字符串与数字的转换,在标准库中提供了相关的类对字符串和数字进行转换。字符串流类(sstream)用于 string 的转换:a>
-- 相关头文件;b> istringstream -- 字符串输入流;c> ostringstream -- 字符串输出流;使用方法如下 下来我们以示例代码来分析说明
#include#include #include using namespace std; double to_number(string s) { istringstream iss(s); double num; iss >> num; return num; } string to_string(double n) { ostringstream oss; oss << n; string s = oss.str(); return s; } int main() { double d = to_number("123.45"); cout << d << endl; string s = to_string(543.21); cout << s << endl; return 0; } 我们看到已经实现了一个字符串转数字的函数和数字转字符串的函数。那么我们看看编译结果如何呢
确实是成功转换过来了,那么这样的转换在 C 语言中也能实现,不过肯定很麻烦了。那么我们上边编写的函数是有一定问题的,我们只是转换了 double 类型的数字,那要是 int,char 类型的呢?可能有人会说直接复制下函数,改下参数类型就OK了呀,但是这样不觉得麻烦嘛?在 C++ 中有模板的概念,等我们后面学习到了,这个就非常简单了。按照我们现在所学习的知识来说,写一个宏是非常合适的。利用宏生成一个临时对象,刚好它的生命周期也只有那一行,类型的问题就解决了。那么我们来继续实现下,程序如下
#include#include #include using namespace std; #define TO_NUMBER(s, n) (istringstream(s) >> n) #define TO_STRING(n) (((ostringstream&)(ostringstream() << n)).str()) int main() { double n = 0; if( TO_NUMBER("123.45", n) ) { cout << n << endl; } string s = TO_STRING(12345); cout << s << endl; return 0; } 我们在第 7、8 行用宏实现了两个转换函数的功能,编译下看看结果呢
那么我们已经正确的实现了功能。我们经常在面试题中会见到字符串循环移动的问题:比如给定 abcdefg 循环右移 3 位后得到 efgabcd。我们现在就用 C++ 来完成这个面试题
#include#include using namespace std; string rigth_string(const string& s, unsigned int n) { string ret = ""; unsigned int pos = 0; n = n % s.length(); pos = s.length() - n; ret = s.substr(pos); ret += s.substr(0, pos); return ret; } int main() { string s = "abcdefg"; string r = rigth_string(s, 3); cout << r << endl; return 0; } 那么我们在 C++ 中就只用 4 行语句就实现了循环右移的功能。看看编译结果呢
我觉得这样还有点不直观,我们直接重载下操作符 << ,用 << 来实现右移的功能
#include#include using namespace std; string operator << (const string& s, unsigned int n) { string ret = ""; unsigned int pos = 0; n = n % s.length(); pos = s.length() - n; ret = s.substr(pos); ret += s.substr(0, pos); return ret; } int main() { string s = "abcdefg"; string r = (s << 3); cout << r << endl; return 0; } 结果如下
这样是不是更直观呢?通过对 C++ 中的字符串类的学习,总结如下:1、应用开发中大多数的情况都在进行字符串处理,在 C++ 中没有直接支持原生的字符串类型;2、标准库中通过对 string 类支持字符串的概念;3、string 类支持字符串和数字的相互转换;4、string 类的应用使得问题的求解变得简单。
欢迎大家一起来学习 C++ 语言,可以加我QQ:243343083。
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
新闻标题:C++中的字符串类(二十七)-创新互联
文章URL:http://ybzwz.com/article/pdchh.html