字符串+指针-练习题
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); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?