函数重载练习(2)

题目描述

补全代码,实现不同类型的加法:

  • add(int, int)和add(double, double):返回参数的和
  • add(str, str):分配并创建新的字符串,它是两字符串按顺序拼接的结果
  • add(str, char):分配并创建新的字符串,它是字符串后拼接字符的结果

关于输入

输入共六行,字符串长度保证结果可存储在内存中

第一行:两个整数

第二行:两个浮点数

第三行到第五行:一个整数n和一个字符串,n代表字符串长度

第六行:一个字符

关于输出

输出共四行

第一行:整数加法结果

第二行:浮点数加法结果

第三行:前两个字符串加法结果

第四行:最后一个字符串加字符的结果

易错点提示

  • new[]delete[] 相互对应;不能 delete[] 局部变量或全局变量的内存。
  • new[] 后接初始化,可以保证所有内存的内容都是妥善的。
  • C 风格字符串结尾的空字符('\0')不要忘记。

参考答案

#include <iostream>
#include <cstring>
using std::cin, std::cout, std::endl;

int add(int a, int b);
double add(double a, double b);
char* add(const char* a, const char* b);
char* add(const char* a, char b);

int add(int a, int b) {
    return a + b;
}
double add(double a, double b) {
    return a + b;
}
char* add(const char* a, const char* b) {
    int len_a = std::strlen(a);
    int len_b = std::strlen(b);
    char* str_ptr = new char[len_a + len_b + 1];
    std::strcpy(str_ptr, a);
    std::strcpy(str_ptr + len_a, b);
    return str_ptr;
}
char* add(const char* a, char b) {
    int len_a = std::strlen(a);
    char* str_ptr = new char[len_a + 2];
    std::strcpy(str_ptr, a);
    str_ptr[len_a] = b;
    str_ptr[len_a + 1] = '\0';
    return str_ptr;
}

char* read_str_from_cin() {
    int len;
    cin >> len;
    char* s = new char[len + 1];
    // c++20后不支持,请暂时调整为c++17
    cin >> s;
    return s;
}

int main() {
    // 整数加法
    int i1, i2;
    cin >> i1 >> i2;
    cout << add(i1, i2) << endl;
    // 浮点数加法
    double d1, d2;
    cin >> d1 >> d2;
    cout << add(d1, d2) << endl;
    // 字符串加法
    char* str_ptr;
    char* s1 = read_str_from_cin();
    char* s2 = read_str_from_cin();
    str_ptr = add(s1, s2);
    cout << str_ptr << endl;
    delete[] str_ptr;
    delete[] s1;
    delete[] s2;
    // 字符串加字符
    char* s3 = read_str_from_cin();
    char c;
    cin >> c;
    str_ptr = add(s3, c);
    cout << str_ptr << endl;
    delete[] str_ptr;
    delete[] s3;
}