📄 习题4.16 .txt
字号:
size_t len = strlen(cp1) + strlen(cp2);
char *result_str = new char[len+1];
strcpy(result_str, cp1);
strcat(result_str, cp2);
delete [] result_str;
return 0;
}
相应的连接两个string类型字符串的程序如下:
// 连接两个string类型字符串
#include <string>
using namespace std;
int main()
{
const string str1("Mary and Linda ");
const string str2("are firends.");
string result_str;
result_str = str1;
result_str += str2;
return 0;
}
习题4.31
编写程序从标准输入设备读入字符串,并把该串存放在字符数组中。描述你的程序如何处理可变长的输入。提供比你分配的数组长度长的字符串数据测试你的程序。
【解答】
// 从标准输入设备读入字符串,并把该串存放在字符数组中
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int main()
{
string in_str;// 用于读入字符串的string对象
const size_t str_size = 10;
char result_str[str_size+1];
// 读入字符串
cout << "Enter a string(<=" << str_size
<< " characters):" << endl;
cin >> in_str;
// 计算需复制的字符的数目
size_t len = strlen(in_str.c_str());
if (len > str_size) {
len = str_size;
cout << "String is longer than " << str_size
<< " characters and is stored only "
<< str_size << " characters!" << endl;
}
// 复制len个字符至字符数组result_str
strncpy(result_str, in_str.c_str(), len);
// 在末尾加上一个空字符(null字符)
result_str[len+1] = '\0';
return 0;
}
为了接受可变长的输入,程序中用一个string对象存放读入的字符串,然后使用strncpy函数将该对象的适当内容复制到字符数组中。因为字符数组的长度是固定的,因此首先计算字符串的长度。若该长度小于或等于字符数组可容纳字符串的长度,则复制整个字符串至字符数组,否则,根据数组的长度,复制字符串中前面部分的字符,以防止溢出。
注意,上述给出的是满足题目要求的一个解答,事实上,如果希望接受可变长的输入并完整地存放到字符数组中,可以采用动态创建数组来实现。
习题4.32
编写程序用int型数组初始化vector对象。
【解答】
// 用int型数组初始化vector对象
#include <iostream>
#include <vector>
using namespace std;
int main()
{
const size_t arr_size = 8;
int int_arr[arr_size];
// 输入数组元素
cout << "Enter " << arr_size << " numbers:" << endl;
for (size_t ix = 0; ix != arr_size; ++ix)
cin >> int_arr[ix];
// 用int型数组初始化vector对象
vector<int> ivec(int_arr, int_arr + arr_size);
return 0;
}
习题4.33
编写程序把int型vector复制给int型数组。
【解答】
// 把int型vector复制给int型数组
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> ivec;
int ival;
// 输入vector元素
cout << "Enter numbers: (Ctrl+Z to end)" << endl;
while (cin >> ival)
ivec.push_back(ival);
// 创建数组
int *parr = new int[ivec.size()];
// 复制元素
size_t ix = 0;
for (vector<int>::iterator iter = ivec.begin();
iter != ivec.end(); ++iter, ++ix)
parr[ix] = *iter;
// 释放数组
delete [] parr;
return 0;
}
习题4.34
编写程序读入一组string类型的数据,并将它们存储在vector中。接着,把该vector对象复制给一个字符指针数组。为vector中的每个元素创建一个新的字符数组,并把该vector 元素的数据复制到相应的字符数组中,最后把指向该数组的指针插入字符指针数组。
【解答】
//4-34.cpp
//读入一组string类型的数据,并将它们存储在vector中。
//接着,把该vector对象复制给一个字符指针数组。
//为vector中的每个元素创建一个新的字符数组,
//并把该vector元素的数据复制到相应的字符数组中,
//最后把指向该数组的指针插入字符指针数组
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
vector<string> svec;
string str;
// 输入vector元素
cout << "Enter strings:(Ctrl+Z to end)" << endl;
while (cin >> str)
svec.push_back(str);
// 创建字符指针数组
char **parr = new char*[svec.size()];
// 处理vector元素
size_t ix = 0;
for (vector<string>::iterator iter = svec.begin();
iter != svec.end(); ++iter, ++ix) {
// 创建字符数组
char *p = new char[(*iter).size()+1];
// 复制vector元素的数据到字符数组
strcpy(p, (*iter).c_str());
// 将指向该字符数组的指针插入到字符指针数组
parr[ix] = p;
}
// 释放各个字符数组
for (ix =0; ix != svec.size(); ++ix)
delete [] parr[ix];
// 释放字符指针数组
delete [] parr;
return 0;
}
习题4.35
输出习题4.34中建立的vector对象和数组的内容。输出数组后,记得释放字符数组。
【解答】
//4-35.cpp
//读入一组string类型的数据,并将它们存储在vector中。
//接着,把该vector对象复制给一个字符指针数组:
//为vector中的每个元素创建一个新的字符数组,
//并把该vector元素的数据复制到相应的字符数组中,
//然后把指向该数组的指针插入字符指针数组。
//输出建立的vector对象和数组的内容
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
vector<string> svec;
string str;
// 输入vector元素
cout << "Enter strings:(Ctrl+Z to end)" << endl;
while (cin >> str)
svec.push_back(str);
// 创建字符指针数组
char **parr = new char*[svec.size()];
// 处理vector元素
size_t ix = 0;
for (vector<string>::iterator iter = svec.begin();
iter != svec.end(); ++iter, ++ix) {
// 创建字符数组
char *p = new char[(*iter).size()+1];
// 复制vector元素的数据到字符数组
strcpy(p, (*iter).c_str());
// 将指向该字符数组的指针插入到字符指针数组
parr[ix] = p;
}
// 输出vector对象的内容
cout << "Content of vector:" << endl;
for (vector<string>::iterator iter2 = svec.begin();
iter2 != svec.end(); ++iter2)
cout << *iter2 << endl;
// 输出字符数组的内容
cout << "Content of character arrays:" << endl;
for (ix =0; ix != svec.size(); ++ix)
cout << parr[ix] << endl;
// 释放各个字符数组
for (ix =0; ix != svec.size(); ++ix)
delete [] parr[ix];
// 释放字符指针数组
delete [] parr;
return 0;
}
习题4.36
重写程序输出ia数组的内容,要求在外层循环中不能使用typedef定义的类型。
【解答】
//4-36.cpp
//重写程序输出ia数组的内容
//在外层循环中不使用typedef定义的类型
#include <iostream>
using namespace std;
int main()
{
int ia[3][4] = { // 3个元素,每个元素是一个有4个int元素的数组
{0, 1, 2, 3} , // 0行的初始化列表
{4, 5, 6, 7} , // 1行的初始化列表
{8, 9, 10, 11} // 2行的初始化列表
};
int (*p)[4];
for (p = ia; p != ia + 3; ++p)
for (int *q = *p; q != *p + 4; ++q)
cout << *q << endl;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -