字符串+指针-练习题

1:求一个子串在主串中出现位置和次数

复制代码
int main(){
void zizhu(char *a,char *b);
char a[]="iaiyiayuiajuuiaiij";
char b[]="iai";
zizhu(a,b);
return 0;
}
void zizhu(char *a,char *b){
int alen=strlen(a);
int blen=strlen(b);
int i,j,k,s;
int sum=0;
for(i=0;i<alen;i++){
        k=i;
        s=0;
    for(j=0;j<blen;j++){
        if(a[k++]==b[j]){
            s++;
        }else{
            break;//退出当前循环
        }
    }
    if(s==blen){//子串出现
        sum++;
        printf("出现位置%d;第%d次\n",i+1,sum);
    }
    if(k==alen){break;}
}
}
复制代码

2:将字符串按字符顺序从小到大排序,删除重复字符

复制代码
int main(){
   char a[]="yeyggdbbaahj*^!";
   int i,k;
   for(i=0;i<15;i++){
    for(k=0;k<15-i-1;k++){
        if(a[k]>a[k+1]){
           printf("交换%c,%c\n",a[k],a[k+1]);
           change(a[k],a[k+1]);

        }
    }

  }
   for(i=0;i<15;i++){
        printf("%c ",a[i]);
   }
   printf("\n");
   int m=0,n,p=15;
   while(m<p){
    if(a[m]!=a[m-1]){
        printf("%c ",a[m]);
m++ }else{
for(n=m;n<p;n++){
a[n]=a[n+1];
}
a[n+1]=' ';
p=p-1;
}
} return 0; }
复制代码

3:求str1,str2最长公共子串

复制代码
int main(){
    char str1[]="asdfghjkl";
    char str2[]="qwerasdcvasdf";
    int i,j;
    char Max[50];
    char cop[50];
    int len=0,k,m;
    for(i=0;str1[i]!='\0';i++){
            k=i;
            m=0;
            char str3[50];
            printf("str1往前移一步\n");
        for(j=0;str2[j]!='\0';j++){
            if(str1[k]==str2[j]){
                str3[m]=str1[k];
                printf("i=%d,j=%d,k=%d,%c=%c\n",i,j,k,str1[k],str2[j]);
                printf("%c放入str3[%d]\n",str3[m],m);
                m++;
                k++;
            }else{
                printf("i=%d,j=%d,k=%d,%c!=%c\n",i,j,k,str1[k],str2[j]);
                k=i;//str1从头开始,str2继续
                if(m>=len){//如果str3的长度最长,设置为最长字符串
                    len=m;
                    strcpy(Max,str3);
                    printf("目前最大串%s\n",Max);
                }
                strcpy(str3,cop);//str3初始化
                m=0;//m初始化
                continue;
            }
            if(m>=len){//最后一个判断;如果str3的长度最长,设置为最长字符串
                    len=m;
                    strcpy(Max,str3);
                    printf("目前最大串%s\n",Max);
                }

        }


    }
Max[len]='\0';
printf("%s",Max);
return 0;
}
复制代码

4:输入字符串str1 str2, 各串中无重复出现字符,输出交集

复制代码
int main(){
    char str1[max],str2[max],str3[max];
    printf("输入字符串str1:");
    gets(str1);
    printf("输入字符串str2:");
    gets(str2);
    int s1=0,s3=0;
    while(str1[s1]!='\0'){
        int s2=0;
        while(str2[s2]!='\0'){
            if(str1[s1]==str2[s2]){
                str3[s3]=str1[s1];
                s3++;
                break;//相等退出与str2比较
            }
            s2++;
        }
        s1++;
    }
    str3[s3]='\0';
    if(str3[0]!='\0'){
        printf("%s",str3);
    }

}
复制代码

5:求给定三个字符串最长子串

复制代码
char *copy(char *s,int start,int count)//指针型函数
{
    int i;
    static char str[M];
    char *temp=str;
    for(i=start;i<=start+count-1;i++)
    {
        *temp++=*(s+i);
    }
    *temp='\0';
   // printf("当前母copy串:[%s]\n",str);
    return str;

}
复制代码
复制代码
void main()
{
    static char *a[3]={"what is a pap ex j?","nae is pap j","is pap ex"};
    char *ch,maxstr[M];
    int m,i,j,k,p,bool,maxl=0;
    m=strlen(a[0]);
    for(j=0;j<m-1;j++)
    {
        for(k=1;k<=m-1;k++)
        {
            ch='\0';
            //printf("a[0],j=%d,k=%d\n",j,k);
            ch=copy(a[0],j,k);
            printf("ch:%s\n",ch);
            bool=1;
            p=0;
            while(p<2)//判断子串
            {
                p++;
                if(strstr(a[p],ch)==0)
                {
                    bool=0;//strstr(s,t)判断s是否为t子串,若不是返回0
                }
            }
            if((bool==1)&&(strlen(ch)>maxl))//若子串较长保存子串
            {
                //printf("ch=%s\n",ch);
                maxl=strlen(ch);
                strcpy(maxstr,ch);
            }
        }
    }
    if(maxl!=0)\
    {
        printf("最长字符串:[%s]\n",maxstr);
    }
    else
    {
        printf("没了");
    }
}
//strstr(s,t)原型判断s是否为t子串,若不是返回0
char *Mystrstr(char *str,char *subStr){
    while (*str !='\0' ) {
        char *p = str;
        char *q = subStr;
        char *res =NULL;
        if (*p == *q) {
            res = p;
            while (*q !='\0' && *p == *q){
                p++;
                q++;
            }
           if (*q =='\0')return res;
        }
        str++;
    }
    return NULL;

}
复制代码

6:查找两个字符串中的最长公共子串

1:

复制代码
 char* findStr( char* src,  char* sub)
{
     char* bp;
     char* sp;

    if (src == NULL || sub == NULL) return NULL;

    while (*src != '\0') //遍历src字符串
    {
        bp = src;  //用于src的遍历
        sp = sub;  //用于sub的遍历
        do
        {
            if (!*sp)           //如果到了sub字符串结束符位置
                return src;    //表示找到了sub字符串,退出
        } while (*bp++ == *sp++);
        src += 1;
    }

    return NULL;
}

char *commonString(char* str1, char* str2)
{
    int i, j;
    char *shortStr, *longStr;
    char *subStr;

    if (str1 == NULL || str2 == NULL) return NULL;

    if (strlen(str1) <= strlen(str2))
    {
        longStr = str2;
        shortStr = str1;
    }
    else
    {
        longStr = str1;
        shortStr = str2;
    }

    if (findStr(longStr, shortStr) != NULL) return shortStr;

    subStr = (char*)malloc(sizeof(char)* (strlen(shortStr) + 1));

    for (i = strlen(shortStr) - 1; i > 0; i--)  //subStr 长度逐渐减小
    {
        for (j = 0; j <= strlen(shortStr) - i; j++)
        {
            memcpy(subStr,&shortStr[j],i);    //将短字符串的一部分复制到subStr
            subStr[i] = '\0';
            if (findStr(longStr, subStr) != NULL)  //所以第一个找到的就是最大子串
                return subStr;
        }
    }
    return NULL;
}

int main()
{
    char str[100] = "123467dfsdf";
    char str1[100] = "12345678dfsdfsdf";
    printf("%s",commonString(str, str1));

    return 0;
}
复制代码

2:kmp

复制代码
void Next(char *T, int *next)
{
    int i = 1;
    next[1] = 0;
    int j = 0;
    while (i < strlen(T))
    {
        if (j == 0 || T[i - 1] == T[j - 1])
        {
            i++;
            j++;
            next[i] = j;
        }
        else
        {
            j = next[j];
        }
    }
}
int KMP(char *S, char *T)
{
    int next[10];
    int changdu,maxcd=0;
    Next(T, next); //根据模式串T,初始化next数组
    int i = 1;
    int j = 1;
    while (i <= strlen(S) && j <= strlen(T))
    {
        //j==0:代表模式串的第一个字符就和当前测试的字符不相等;S[i-1]==T[j-1],如果对应位置字符相等,两种情况下,指向当前测试的两个指针下标i和j都向后移
        if (j == 0)
        {
            i++;
            j++;
            changdu=0;
        }
        else if (S[i - 1] == T[j - 1])
        {
            i++;
            j++;
            changdu=j;
        }
        else
        {
            j = next[j]; //如果测试的两个字符不相等,i不动,j变为当前测试字符串的next值
        }
        if(changdu>maxcd)
        {
            maxcd=changdu;
        }
    }
    if (j > strlen(T))
    { //如果条件为真,说明匹配成功
        printf("the max length is:%d", strlen(T));
        return i - (int)strlen(T);
    }
    printf("the max length is:%d", maxcd-1);
    return -1;
}
int main()
{
    char s1[]="abc1234def";
    char s2[]="abc1234f";
    char s3[]="rabch";
    int i = KMP("ababcabcacbab", "abcd");
    if(i != -1)//完全匹配
    {
        printf("sucess %d\n", i);

    }

    return 0;
}
复制代码

7:将两个字符串连接,不破坏原字符串

复制代码
char *myconnect(char *s1,char *s2)
{
    char *s,*p,*q;
    int len1=0,len2=0;
    p=s1;
    while(*p!='\0')
    {
        len1++;p++;
    }
    p=s2;
    while(*p!='\0')
    {
        len2++;p++;
    }
    s=q=(char *)malloc(sizeof(len1+len2));
    p=s1;
    while((*q++=*p++)!='\0');
    q--;//q后退到'\0'
    p=s2;
    while((*q++=*p++)!='\0');
    return s;

}

void main()
{
    char s1[]="abcdef";
    char s2[]="1234";
    char *s;
    s=myconnect(s1,s2);
    printf("%s\n",s);
}

 
复制代码

8:将old中出现sub的替换为rpl,替换之后结果存在new

复制代码
void f(){
    char old[]="asdfgh sdfghj asdt",*o=old;
    char sub[]="asd",*s=sub;
    char rpl[]="qwe",*r=rpl;
    char news[Max],*n=news;
    char *s1,*s2;
    while(*o!='\0'){
        printf("%c\n",*o);
        for(s1=o,s2=sub;*s1!='\0'&&*s2!='\0'&&(*s1==*s2);s1++,s2++);//匹配子串,不相等停止
        if(*s2!='\0'){//没有到达子串结束,说明不存在子串
            *n++=(*o++);
            printf("%s\n",news);
        }else{//到达子串结束,说明存在子串
            for(s2=r;*s2!='\0';s2++){
                *n++=(*s2);
                printf("%s\n",news);
            }
            o=s1;//o=o+strlen(sub)
        }

    }
    *n='\0';
    printf("%s",news);
}
复制代码

9:两个英文句子,每个句子英文单词空格分开,输出最长公共单词

复制代码
void i(){
    char a[]="aaaaaaa is a root keep seem",*s=a;//n记录往后开始的位置
    char b[]="b are root aaaaaaa deem",*t=b;
    char *temp;
    char chs[Max],cht[Max];
    char comm[Max];
    int i,j,found,maxlen=0;
    while(*s!='\0'){//扫描s
        while(*s==' ')s++;//s跳过空格
        for(i=0;*s!=' '&&*s!='\0';i++,s++){//将s的一个单词放入chs,i为长度
             chs[i]=*(s);
         }
        chs[i]='\0';
        if(i>maxlen){
           found=0;
           temp=t;
           while(*temp!='\0'&&found==0){
            while(*temp==' ')temp++;//跳过空格
            for(j=0;*temp!=' '&&*temp!='\0';temp++,j++){//t的一个单词放入cht,j为长度
                cht[j]=*temp;
            }
            cht[j]='\0';
            if(i==j){
                if(strcmp(chs,cht)==0){
                    maxlen=i;
                    strcpy(comm,chs);
                    found=1;
                }
            }
           }
        }


    }
    if(maxlen==0){
        printf("null");
    }else{
        printf("%s",comm);
    }
}
复制代码

10:对字符进行排列:冒泡排序,递增排序

复制代码
void k(){
    char *a[]={"FORTRAN","PASCAL","BASIC","C","COBOL","SMALLTALK"};
    char *tem;
    int i,j,n=6;
    //对字符进行排列:冒泡排序,递增排序
    for(i=1;i<n;i++){
        for(j=0;j<n-i-1;j++){
            if(strcmp(a[j],a[j+1])>0){
                tem=a[j];
                a[j]=a[j+1];
                a[j+1]=tem;
            }
        }

    }
    for(i=0;i<n;i++){
        printf("%s ",a[i]);
    }
    printf("\n");
    //输入字符匹配包含字符的语言单词
    char s[10];
    gets(s);
    char *p;
    char *oth;
    for(i=0;i<n;i++){
        for(p=s,oth=a[i];*p!='\0'&&*oth!='\0'&&*oth==*p;p++,oth++);//匹配字符
        if(*p=='\0'){
            printf("%s\n",a[i]);
        }


    }
}
复制代码

11:输入若干字符,找出最长字符串并输出,用指针数组存放字符串

复制代码
char *findlong(char *str[],int n,int *length){
    int max=0;
    int no;
    int i,tmp;
    for(i=0;i<n;i++){
        if((tmp=strlen(str[i]))>max){
            max=tmp;
            no=i;
        }
    }
    *length=max;
    return str[no];
}
void main(){
    char *str[10],*p;//指针数组
    int n,i,length;
    printf("字符串个数:");
    scanf("%d",&n);
    for(i=0;i<n;i++){
        printf("第%d个字符串:");
        str[i]=(char *)malloc(20);
        scanf("%s",str[i]);

    }
    p=finlong(str,n,&length);
    printf("字符串%s,长度%d",p,length);
}
复制代码

 

posted on   Y-flower  阅读(119)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示