/*******************************************************
* C++ Primer 4.34 4.35习题 *
*编写程序读入一组 string 类型的数据,并将它们存储在 *
*vector 中。接着,把该 vector 对象复制给一个字符指针数*
*组。为 vector 中的每个元素创建一个新的字符数组,并把 *
*该 vector 元素的数据复制到相应的字符数组中,最后把指 *
*向该数组的指针插入字符指针数组。 *
*******************************************************/
#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
using
namespace
std;
int
_tmain(
int
argc, _TCHAR* argv[])
{
vector<string> ivec;
ivec.push_back(
"Hello world"
);
ivec.push_back(
"Hello everybody!"
);
ivec.push_back(
"Hello my family!"
);
vector<string>::size_type size = ivec.size();
vector<string>::iterator itr = ivec.begin();
vector<string>::iterator end = ivec.end();
vector<string>::size_type vSize = ivec.size();
// vector的大小
char
**chars =
new
char
* [vSize];
// 动态分配字符指针数组
// 赋值操作左边有两个星号可理解为chars本身的元素是一个char*型,
// new操作符又返回了一个指针指向字符数组,所以是char **chars
// 注意赋值的右侧不能是new (char*)[vSize],没有在new后面加()的语法。
int
i = 0;
while
(itr != end) {
string str = *itr;
// 从vector中得到下一个string
const
char
* strContent = str.c_str();
// 将string转换为c风格字符串
size_t
strLength =
strlen
(strContent);
// 求字符串长度,不包含null字符
char
*strArray =
new
char
[strLength + 1];
// 为当前字符串动态分配一个数组
chars[i] = strArray;
// 记录这个字符数组的首地址
// chars[i]相当与*(chars + i)
for
(
int
k = 0; k != strLength + 1; k++) {
// 将字符串的内容拷贝到新的数组中
strArray[k] = strContent[k];
}
++itr;
++i;
}
for
(
int
j = 0; j != 3; j++) {
// 显示各字符串
cout << chars[j] << endl;
delete
[] chars[j];
// 释放字符数组
}
delete
[] chars;
// 释放字符指针数组
return
0;
}