字符串的题目与一般题目相比难度会有所提升,还得注意每个字符间的空格和换行符,我的解法不算是基础解法,所以我基本每句都写了注释,主要思路还是先用循环去除空格,再用循环将字符串的顺序颠倒,如果不熟悉指针,也可以不用函数,就直接在main函数中进行循环。

#include <stdio.h>

#include <string.h>// 使用字符串数据库

#define max_l 100005//定义最大测试长度

void a(char *str, char *newStr)//去除字符串中的空格

{

    int j = 0;// 定义一个存储空格数的值

    for (int i=0;str[i]!='\0';i++)// 循环检测空格

    {//若不为空格,则将其复制到newStr中,并递增j,间接去除了空格

        if (str[i]!=' ')

        {

            newStr[j]=str[i];

            j++;

        }

    }

    newStr[j]='\0';// 处理完毕,在末尾添加结束字符,得到不含空格的字符串

}

// 反转字符串

void b(char *str)

{

    int len=strlen(str);//通过strlen函数得到处理后的字符串的长度,从而确定循环次数

    for (int i=0;i<len/2;i++)//将前半部分与后半部分的字符互换,故只需要循环字符串长度的一半

    {

        char temp = str[i];

        str[i] = str[len - i - 1];

        str[len - i - 1] = temp;

    }

}

int main(void)

{

    int t;//定义需要测试的组数

    scanf("%d",&t);

    for (int k=0;k<t;k++)

    {

        int n;//定义输入带空格字符串的长度

        scanf("%d",&n);

        getchar();//读取输入结束后的换行符

        char l[max_l];//定义一个能存储最大长度字符串的数组

        fgets(l, max_l, stdin);//这里之所以不用n作为被读取字符串的长度,是为了统一fgets读取的长度,因为n不是固定不变的,会使计算内容变得麻烦,且用最大长度可避免输入字符的长度超过n的情况,避免出现崩溃的情况

        l[strcspn(l,"\n")]='\0';//将读取到的换行符换为结束符,从而达到分开每组数据的条件

        char nl[max_l];//定义一个数组,存储去除空格后的字符串

        a(l, nl);//进入去除字符串中空格的函数

        b(nl);//进入反转处理后的字符串的函数

        printf("%s\n", nl);//输出结果

    }

    return 0;

}