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