pta指针(二).第三题

题目描述

将s所指字符串的正序和反序进行连接,形成一个新串放在t所指的数组中。

函数接口定义

void fun (char *s, char *t);
其中s 和t都是用户传入的参数。函数将s所指字符串的正序和反序进行连接,形成一个新串放在t所指的数组中。

裁判程序样例:

#include  
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函数,我们可以只需要一次循环,就是一次逆序的循环,然后将顺序的字符串和逆序的字符串拼接到一起,也就实现了题目的要求。

你可能感兴趣的:(pta指针(二).第三题)