PTA滤字符、函数CHG、mystrcpy--指针练习

看看题目叭~

目录

一、滤字符

二、请编写函数CHG(char *S)

三、myctrcpy


一、滤字符

以指针的方式,将某个字符串中出现的特定字符删去,然后输出新的字符串。

输入格式

首先输入一个正整数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楠钰子.

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序和三三总有一个能跑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值