电话号码升位(拷贝构造函数)

1.题目

定义一个电话号码类CTelNumber,包含1个字符指针数据成员,以及构造、析构、打印及拷贝构造函数。

字符指针是用于动态创建一个字符数组,然后保存外来输入的电话号码

构造函数的功能是为对象设置键盘输入的7位电话号码,

拷贝构造函数的功能是用原来7位号码的对象升位为8位号码对象,也就是说拷贝构造的对象是源对象的升级.电话升位的规则是原2、3、4开头的电话号码前面加8,原5、6、7、8开头的前面加2。

注意:电话号码只能全部是数字字符,且与上述情况不符的输入均为非法

2.代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
using namespace std;

class CTelNumber
{
private:
char* str;
public:
CTelNumber(const char* num);
CTelNumber(const CTelNumber& c);
~CTelNumber();
void print();
};

CTelNumber::CTelNumber(const char* num)
{
str = new char[9];
strncpy(str, num , 7);
str[7] = '\0';
}

CTelNumber::CTelNumber(const CTelNumber& c)
{
str = new char[9];
strcpy(str, c.str);

if (str[0] == '2' || str[0] == '3' || str[0] == '4')
{
str[0] = '8';
}
else
{
str[0] = '2';
}
for (int i = 1; i < 8; i++)
{
str[i] = c.str[i - 1];
}
str[8] = '\0';
}

CTelNumber::~CTelNumber()
{
delete[]str;
}

void CTelNumber::print()
{
cout << str << endl;
}

bool isValid(char* s)
{
if (strlen(s) != 7 || s[0] == '1' || s[0] == '0' || s[0] == '9')
{
return false;
}

for (int i = 0; i < 7; i++)
{
if (s[i] > '9' || s[i] < '0')
{
return false;
}
}
return true;
}

int main()
{
int t;
cin >> t;

for (int i = 0; i < t; i++)
{
char* pn = new char[8];
cin >> pn;
bool flag = isValid(pn);
if (flag)
{
CTelNumber c1(pn);
CTelNumber c2(c1);
c2.print();
}
else
{
cout << "Illegal phone number" << endl;
}
}
return 0;
}

长教训了真的 下次我一定一定一定仔细读题
题目说234前面加8
5678前面加2
我一直都忘记了9这个数字开头也会是非法
一直只考虑了01开头非法
就多考虑这一点点 我前两天下午交的第一遍就可以对了!
后面我就是一直改一直试 我说怎么就不对我一定要做出来
后面实在是过不了了 我就把我的答案和题目发给AI 让它帮我改 我仔细对照了一下 我说那几个主要的函数都没有问题啊 而且我那三个测试样例可以过两个 到底是什么鬼
然后我就把AI的答案放进去测试就过了
虽然过了但我一直耿耿于怀 刚刚直接把前面写的全删了 我说我直接重开 我一定要找出来哪里有问题
最后的最后就是我发现…也是很眼瞎了 也是很执着了 也是长教训了!
所以把这道题写进来,希望自己以后多考虑一点。。。要不又是浪费时间在小问题上了。