EOJ 1804 string


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define max 1025
char *strca(char *a,char *ss)//把字符串ss连接到被操作的字符串之后
{
    int i,j,k;
    i=strlen(a);//测量原字符串和新加的字符串的长度
    j=strlen(ss);
    for(k=0;k<=j;k++)
    {
        a[i+k]=ss[k];//将ss加在a后面
    }
    return a;
}
int strequ(char *a,char *ss)//判断a与ss字符串是否相等
{
    int i=0;
    while(a[i]==ss[i]&&a[i]!='\0'&&ss[i]!='\0')//如果a,ss的第i个字符相等并且两者都不是结束符,i++
    {
        i++;
    }
    if(a[i]=='\0'&&ss[i]=='\0')
    {
        return 1;//如果恰好比较到两者都到了结束符,说明之前的字符全都相等,返回1
    }
    else return 0;
}
int main()
{
    char a[max]={0};//初始化字符串
    char ca[max]={0};
    char ss[max]={0};
    scanf("%s",a);//输入初始的字符串
    int q,i,j,k;
    scanf("%d",&q);//操作数q
    for(i=1;i<=q;i++)
    {
        scanf("%s",ca);//输入操作
        if(ca[3]=='c')//即输入了strcat
        {
            scanf("%s",ss);//输入要加的字符串,并打印
            printf("%s\n",strca(a,ss));
        }
        else if(ca[3]=='s')//如果输入了strsub
        {
            int m,n;
            scanf("%d%d",&m,&n);//输入要打印的子串的开头结尾
            int la=strlen(a);
            if(m<0||n>=la)//如果输入的不合法,输出fail
            {
                printf("fail\n");
            }
            else if(n<0||m+n>la)
            {
                printf("fail\n");
            }
            else
            {
                for(k=0;k<n;k++)//输入合法,打印出子串
                {
                    printf("%c",a[k+m]);
                }
                printf("\n");
            }
        }
        else if(ca[3]=='e')//如果输入的是strequ
        {
            scanf("%s",ss);
            int fn=strequ(a,ss);//调用比较函数
            if(fn==1)
            {
                printf("yes\n");//如果return==1标示相等 输出yes
            }
            else if(fn==0)
            {
                printf("no\n");
            }
        }
    }
}
感悟:本题中判断两个字符串是否相等的函数中,要注意相等的条件是从开头一直到碰到结束符都相等,如果一方碰到结束符而另一方没有,则两者肯定不等。另外,判断输入了何种操作的时候应用了一个小技巧,不必去比较整体的string而只需比较其三者的第4个不同的字符,这样更为便捷。还有输出子串的函数不需要另写,直接判断合不合法后输出即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值