0、有意义的字符串处理题
1、为了做这题
我花了好几个小时,一大部分在查C语言库提供了哪些可以解决这个问题的函数,刚刚开始使用的是<string.h>中的strstr(s,s1):返回NULL或者s1在s中首次出现的地址,注意这是一个地址(char*),然后一串乱搞,没搞成。
后来翻来这本书,仔细研究了strcmp(s1,s2)和
strcpy(s1,s2),strncpy(s1,s2,n)这三个函数以后,让我天灵盖一通。
2、写下了这段代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
char s1[1000];
char s2[1000];
printf("请输入长字符串s1:\n");
gets(s1);//输入字符串s1
printf("请输入短字符串s2:\n");
gets(s2);//输入字符串s2
int s1L = strlen(s1);//存字符串s1的长度
int s2L = strlen(s2);//存字符串s2的长度
printf("字符串长度s1L=【%d】,s2L=【%d】\n",s1L,s2L);
char*spp=(char *)malloc(s2L);//存放复制的字符串
char*s2p=s2;//指向s2的字符指针
int i;
int bool=1;
for(i = 0;i<s1L-s2L+1;i++){//遍历s1长度-s2-1长度
bool=1;
if(s1[i]==s2[0]){//判断首字母是否有匹配关系
//***/下面这两句是测试使用代码,使用时可注释掉!
//printf("匹配的首项是第:%d项\n",i);
//printf("此时s2[0]的值为:%c\n",s2[0]);
/*此处可能是最难理解的,我也是画图才写出来的
作用就是如果s2的首个字符与s1的某个匹配,
就有可能后面也匹配,这时,我们需要检查
后面的字符是否也匹配。
*/
//比较:s2+1字符串和s[i+1]开始的后边(s2L-1)个字符
bool=strcmp(s2p+1,strncpy(spp,&s1[i+1],s2L-1));
//***下面这句是测试使用代码,使用时可注释掉!
//printf("比较结果bool=%d\n",bool);//测试使用代码
if(bool==0){//相等返回0,说明有匹配项,
//***下面这句是测试使用代码,使用时可注释掉!
//printf("存在字符串匹配的情况!\n");
s1[i]='#';//断点处设为#
for(int k=1;k<s1L-i-1;k++){//下一步,就是断点以后的元素全都前移啦
s1[i+k]=s1[(i+k)+s2L-1];
}
i-=s2L-1;//别忘了i也要前移
}
}else{
//下面这两句是测试使用代码,使用时可注释掉!
//printf("\n");
//printf("不匹配的项是:i=【%d】\n",i);
}
}
printf("处理后的数组长度:%d\n",strlen(s1));
puts(s1);//显示处理后的字符串
free(spp);//malloc申请的内存空间别忘了free掉
return 0;
}