看看题目叭~
目录
一、滤字符
以指针的方式,将某个字符串中出现的特定字符删去,然后输出新的字符串。
输入格式
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。 每组测试数据输入一个字符串s和一个非空格字符t。其中s的长度不超过100,且只包含英文字母。
输出格式
对于每组测试,将删掉t后新得到的字串输出。如果串被删空,则输出“NULL”(引号不必输出)。
输入样例
2
eeidliecielpvu i
ecdssnepffnofdoenci e
输出样例
eedlecelpvu
cdssnpffnofdonci
想法一
遇到相同的字符时,每找到一次就串就从当前字符左移一循环,覆盖原值。
如果遍历结束后,串的第一个字符是\0,说明串被删空,则输出“NULL”
#include<stdio.h>
#define N 1000
void dele(char *c,char s);
int main()
{
int t,i,j;
scanf("%d",&t);//t为测试组数
char c[N][N];
char s;
for(int w=0;w<t;w++)//该循环为t组测试数据
{
scanf("%s",&c[w]);
getchar();
scanf("%c",&s);
dele(c[w],s);
}
for(int w=0;w<t;w++)
{
if(c[w][0]=='\0')//被删成了空串
printf("NULL");
else
printf("%s",c[w]);
if(w!=t-1)
printf("\n");//格式要求
}
}
void dele(char *c,char s)
{
char t;
int i=0;
while(*c!='\0')
{
if(*c==s)
{ i=0;
while(*(c+i)!='\0')
{
*(c+i)=*(c+1+i);
i++;
}
c--;//因为从当前字符开始串左移了一位
}
c++;
}
}
关于循环里的c--,有必要说一下,这是我想到的笨办法。因为我们左移了一位,所以左移后c指向的其实是原本的下一位,但是当前循环还没有判断到原本的下一个字符,所以c--;
能能能听懂吧(弱小)
想法二
如果一个字符不同就存一个,并且记录有效字符长度,相同就跳过该步骤。
最后 第 有效长度 字符设为\0,作为结束。
其余和上一个想法相同。
函数替换为:
void dele(char *c,char s)
{
char t;
int i=0,j=0;
while(c[i]!='\0')
{
if(c[i]!=s)
{
c[j]=c[i];
j++;
}
i++;
}
c[j]='\0';
}
二、请编写函数CHG(char *S)
请编写函数CHG(char S)实现程序功能: 把S字符串中的所有字符左移一个位置,串中的第一个字符移到最后,之后把已处理的字符串逆转后仍存入原字符数组中
函数接口定义
在这里描述函数接口。
void CHG(char *s);
裁判测试程序样例
在这里给出函数被调用进行测试的例子。例如:
#include <stdio.h>
#include <string.h>
void CHG(char *s);
int main()
{
char s[100], t[100];
scanf("%s", s);
CHG(s);
printf("%s", s);
return 0;
}
/* 请在这里填写答案 */
输入样例
abcde
输出样例
aedcb
想法
记录第一个字符,其余字符依次前移一位,最后把记录的第一个字符放到末尾;
已处理的字符串逆转后仍存入原字符数组中,采取对称的交换,即第一个和最后一个交换,第二个和倒数第二个交换,引用为j++,k--;
void CHG(char *s)
{
char c=*s;
int l=strlen(s);
int i=0,j,k;
while(i<l)
{
*(s+i)=*(s+i+1);
i++;
}
*(s+i-1)=c;
*(s+i)='\0';//这句也可以没有,因为字符前移的时候,\0没有前移
for(j=0,k=l-1;j<l/2;j++,k--)
{
c=*(s+j);
*(s+j)=*(s+k);
*(s+k)=c;
}
}
三、myctrcpy
题目要求
写一个函数 mystrcmp实现字符串比较,相等输出 0,不等输出其差值,在主函数输出比较结果。
想法
1.遍历两个字符串的字符,相同则下一位,不同则返回差值。
2.如果一个字符串读完,就返回另一个字符串对应的当前的字符的ASCII码。
3.如果读完两个字符串完全相同,就返回0。
//值得说明的是,因为函数类型定义为int,所以把字符转化成ASCII码这一步可以交给函数的return,或者严谨一点可以(int)强制转换。更严谨就是unsigned int了。
#include<stdio.h>
#define N 20
int mystrcmp(char *s1,char *s2);
int main()
{
char str1[N],str2[N];
gets(str1);
gets(str2);
printf("compare result = %d\n",mystrcmp(str1,str2));
return 0;
}
int mystrcmp(char *s1,char *s2)
{
while(*s1!='\0'&&*s2!='\0')
{
if (*s1==*s2)
{
s1++;
s2++;
}
else
return (*s1-*s2);
}
while(*s1 != '\0')
return *s1;
while(*s2 != '\0')
return -*s2;
return 0;
}
这周的PTA就这么多想记录的题。
分享就结束啦,感谢阅读!!!!阿里嘎多!!!
2021.12.7
SThree楠钰子.