在 C 语言中是不支持真正意义上的字符串,是用字符数组和一组函数来实现字符串操作的。同样,在 C 语言中不支持自定义类型,因此无法获得字符串类型。那么从 C 到 C++ 的进化过程引入了自定义类型,在 C++ 中可以通过类来完成字符串类型的定义。那么问题来了,C++ 中的原生类型系统是否包含字符串类型呢?
C++ 语言直接支持 C 语言的所有概念,在 C++ 语言中没有原生的字符串类型。但是在 C++ 标准库中提供了 string 类型:a> string 直接支持字符串连接;b> string 直接支持字符串的大小比较;c> string 直接支持子串查找和提取;d> string 直接支持字符串的插入和替换。
下来我们就来看看在 C++ 中的字符串类的使用
#include <iostream>
#include <string>
using namespace std;
void string_sort(string a[], int len)
{
for(int i=0; i<len; i++)
{
for(int j=i; j<len; j++)
{
if( a[i] > a[j] )
{
swap(a[i], a[j]);
}
}
}
}
string string_add(string a[], int len)
{
string ret = "";
for(int i=0; i<len; i++)
{
ret += a[i] + "; ";
}
return ret;
}
int main()
{
string sa[7] =
{
"Hello World",
"D.T.Software",
"C#",
"Java",
"C++",
"Python",
"TypeScript"
};
string_sort(sa, 7);
for(int i=0; i<7; i++)
{
cout << sa[i] << endl;
}
cout << endl;
cout << string_add(sa, 7) << endl;
return 0;
}
我们实现的第一个函数是字符串的排序,按照首字母进行排序。我们可以看到 string 可以直接支持 > 号,并且也提供了 swap 函数,内部的 > 肯定使用了操作符重载。第二个函数是实现字符串的连接,直接用 + 号进行连接,不用说,这里肯定也实现了操作符的重载。我们来看看编译结果
我们看到已经成功实现。下来我们看看字符串与数字的转换,在标准库中提供了相关的类对字符串和数字进行转换。字符串流类(sstream)用于 string 的转换:a> <sstream> -- 相关头文件;b> istringstream -- 字符串输入流;c> ostringstream -- 字符串输出流;使用方法如下
下来我们以示例代码来分析说明
#include <iostream>
#include <string>
#include <sstream>
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 <iostream>
#include <string>
#include <sstream>
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 <iostream>
#include <string>
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 <iostream>
#include <string>
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。
转载于:https://blog.51cto.com/12810168/2119010