题目描述
将s所指字符串的正序和反序进行连接,形成一个新串放在t所指的数组中。
函数接口定义
void fun (char *s, char *t);
其中s 和t都是用户传入的参数。函数将s所指字符串的正序和反序进行连接,形成一个新串放在t所指的数组中。
裁判程序样例:
#include <stdio.h>
void fun (char *s, char *t);
int main()
{ char s[100], t[100];
scanf("%s", s);
fun(s, t);
printf("The result is: %s\n", t);
return 0;
}
/* 请在这里填写答案 */
输入样例:
abcd
输出样例:
The result is: abcddcba
思路分析
在刚看到题目的时候,我下意识的想到,要如果只是复制顺序的字符串的话应该怎么写呢?在不借助string.h头文件中的函数的情况下,我们可以使用一个循环从要复制的字符串的第一个遍历到最后一个。然后在循环的过程中,把每个字符复制到新的字符串的对应位置。代码如下:
for (int i = 0; s[i] != '\0'; i++)
{
t[i] = s[i];
}
t[i] = '\0';
就像上面这样,循环结束之后呢,在复制完的字符串末尾加上一个'\0'来表示该字符串的结束。
现在如果要求我们逆序复制呢,我们可以从要复制的字符串的最后一个遍历到第一个,然后每一步都将该字符复制到对应字符串的对称位置上(最后一个对应第一个)代码如下:
for (int i = strlen(s) - 1, j = 0; i >= 0; i--, j++)
{
t[j] = s[i];
}
t[j] = '\0';
像上面的代码一样,我们让i作为被复制的字符串的下标,它的初始值设置为该字符串的最后一个。j作为要复制到的字符串的下标,从零开始,表示从第一个字符开始复制。
现在呢我们可以将这两种方法综合一下,先顺序复制,再逆序复制。我们可以再循环体外定义一个变量作为将要复制到的字符串的下标,每次循环改变了都要加1,然后分成两个循环,第一个循环就是顺序复制,第二个循环逆序复制。这样两个循环完成后,目标字符串中是不是就是顺序和逆序的组合了呢。代码如下:
int ans = 0;
for (int i = 0; i < strlen(s); i++)
{
t[ans] = s[i];
ans++;
}
for (int i = strlen(s) - 1; i >= 0; i--)
{
t[ans] = s[i];
ans++;
}
t[ans] = '\0';
是不是很简单呢,当然如果借助string.h中的strcat函数,我们可以只需要一次循环,就是一次逆序的循环,然后将顺序的字符串和逆序的字符串拼接到一起,也就实现了题目的要求。