nbsp; 2,istringstream - 字符串输入流;
3,ostringstream - 字符串输出流;
2,使用方法:
1,string ==> 数字;
1,istringstream iss("123.45");
2,double num;
3,iss >> num;
1,传输成功,表达式值为 true,失败则为 false;
4,上述三步,等价于 istringstream("123.45") >> num;
2,数字 ==> string:
1,ostringstream oss;
2,oss << 543.21;
1,返回值是 oss 本身;
3,string s = oss.str();
4,上述三步,等价于 s =(sotringstream() << 543.21).str();
3,输入输出是相对内存而言的;
8,字符串和数字的转换编程实验:
1,main.cpp 文件:
1 #include <iostream>
2 #include <sstream>
3 #include <string>
4
5 using namespace std;
6
7 /* 实际工程用法,目前为止(后续采用模板),只能通过 C 语言中的宏来只写一遍代码处理所有的因类型不同而要完成的函数重载 */
8 #define TO_NUMBER(s, n) (istringstream(s) >> n) // 宏要在一行代码中完成,直接调用构造函数产生临时对象,临时对象声明周期可以满足要求;这里定义了临时对象,并将临时对象传递到 n 中去;
9 #define TO_STRING(n) (((ostringstream&)(ostringstream() << n)).str()) // 调用构造函数生成临时对象,这里 (ostringstream&) 为强制类型转换否则编译器显示 error: ‘struct std::basic_ostream<char, std::char_traits<char> >’ has no member named ‘str’这个错误;
10
11 int main()
12 {
13 double n = 0;
14
15 if( TO_NUMBER("234.567", n) ) // 返回 bool 类型的变量;
16 {
17 cout << n << endl;
18 }
19
20 string s = TO_STRING(12345);
21
22 cout << s << endl;
23
24 return 0;
25 }
9,面试题分析:
1,示例:abcdefg 循环右移 3 位后得到 efgabcd;
10,用 C++ 完成面试题编程实验:
1,main.cpp 文件:
1 #include <iostream>
2 #include <string>
3
4 using namespace std;
5
6 /* 将 string rignt_func(const string& s, unsigned int n) 直接更改名字变成右移操作符重载 */
7 string operator >> (const string& s, unsigned int n)
8 {
9 string ret = "";
10 unsigned int pos = 0; // 找子串右移开始的位置;
11
12 n = n % s.length(); // 防止右移位置很大的情况,让其合法;
13 pos = s.length() - n; // 得到最终想要的位置;
14 ret = s.substr(pos); // 从 pos 开始直到末尾提取子串;
15 ret += s.substr(0, pos); //原来的字符串并没有被破坏,提取到 pos 之前的字符;
16
17 return ret;
18 }
19
20 int main()
21 {
22 string s = "abcdefg";
23 string r = (s >> 3);
24
25 cout << r << endl;
26
27 return 0;
28 }
2,输出结果:
efgabcd
3,整个过程没有出现字符数组,我们站在了更高的角度处理问题,并且函数内部实现也非常简单,没有 for 循环;
4,面试时,对于一个面试题,面试官一般不需要最后的答案,需要的是你如何思考,如何解决的,考察是思维能力和解决问题能力;
1