⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 习题4.16 .txt

📁 c++ primer 答案(第4版) 自己整理的 只有1-5章
💻 TXT
📖 第 1 页 / 共 2 页
字号:

    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 + -