题目描述:
str_cat实现拼接,str_turn实现逆序
思路:
若是链表,我们可以利用尾结点的指针指向另一链表的头指针,但字符串显然做不到,我们可以考虑将另一字符串按顺序从头到尾逐个加入需要输出的字符串末尾;
要加入一个字符,首先需要扩大数组长度,然后在末尾添加字符,与此同时,指向另一字符串的指针也需要加1,指向下一个字符,直到指针指向空,说明到达末尾,添加完成;
需要注意的几点:
1.
先执行扩容(数组)操作,再添加,理由如下:
C中规定,函数strlen计算字符串长度,到空字符结束;
我们先扩容,strlen计算出的长度不变,因为末尾此时有两个空字符,读到前面的空字符(即原数组空字符)时停止计算,这样计算出来的结果正好是我们执行添加操作需要的变量;
反之,如果先添加,在扩容,我们无法保证空字符后面一定也是空字符,他能让strlen正好停止在添加字符的后面。(虽然大多数情况后面为空字符,但我们要避免不必要的麻烦,维持代码的健壮性)
2.
关于字符串的逆序原理很简单,交换首位元素,变量减1或加1,移动一步;
但如何交换两个变量,有两种有趣的实现,且这两种实现方式都不需要设置临时变量来存储需要交换的值,可以省下一个变量空间,但不介意使用这两种方式,因为他们各有优劣:
(1)
int a = 10;
int b = 20;
a^=b^=a^=b;
printf("%d %d\n",a,b);
//a=20,b=10
优点:位运算速度更快,节省空间
缺点:不适用于两个值一样的变量
(2)
int a = 10;
int b = 20;
a = a + b;
b = a - b;
a = a - b;
printf("%d %d\n",a,b);
//a=20,b=10
优点:节省空间
缺点:|a+b|,|a-b|总有一个变量大于等于max(a,b),试想,尽管a,b符合规范,但a+b或a-b有没有可能会溢出呢?
综上,不建议用这两种方式,因为他们都有局限性(存在可能不正确的情况,违背了代码的正确性,可行性),而设置临时变量交换值虽然造成额外开销,但却保证了代码的正确安全。