木子CoCo~


私信TA

用户名:uq_78084890535

访问量:8476

签 名:

等  级
排  名 1169
经  验 3134
参赛次数 1
文章发表 24
年  龄 20
在职情况 学生
学  校 泰州学院
专  业 计算机科学与技术

  自我简介:

努力是奇迹的别名!

解题思路:

1.输入:第一行为短字符串(不含空格),可以利用scanf("%s")输入,区别一下gets和scanf;接下来,就是要输入若干字符串,(此时的字符串可能含有空格)可以通过while(gets(a)!=NULL)来判断。

2.内部思路本题涉及模式串转化为小写、空格处理、查找、删除四部分的操作

(1)模式串转化为小写:题目要求不区别大小写,统一字符,便于比较;

(2)空格处理:遍历主串,判断字符是否为空格;如果if条件成立,则将后面的字符整体移动+1。值得注意的是,i--,因为移动之后此时下标i这个位置的字符也是空格,之后再进行i++时,能够重新判断数组下标i的字符;

(3)查找:利用朴素模式匹配,while(遍历主串),如果(主串中字符为大写-32等于模式串字符)||(主串中字符等于模式串字符),则i++,j++,否则j回溯,模式串 i 从0重新判断;直到i>=strlen(模式串),说明模式串遍历完,主串中存在模式串;

(4)删除:因为主串在进行空格处理之后已经不含空格,我将存在主串中的模式串设置为空格' ',这步为了不改变j的值,引入一个变量pos;

3.输出

 将主串中不为空格的字符输出。

注意事项:要把数组开大一点,避免运行错误。

参考代码:

#include<stdio.h>
#include<string.h>
char s[50];
char a[100];
int main(){
	scanf("%s",s);
	getchar();
	
	int l1=strlen(s);
	//将模式串转化为小写 
	for(int i=0;i<l1;i++){
		if('A'<=s[i]&&s[i]<='Z'){
			s[i]=s[i]+32;
		}
	} 
	//puts(s);
	while(gets(a)!=NULL){
		    int l2=strlen(a);
	        //处理空格
			for(int i=0;a[i]!='\0';i++){
				if(a[i]==' '){
					for(int j=i;a[j]!='\0';j++){
						a[j]=a[j+1];
					}	
					i--;
				}
	
			} 
			
			int l3=strlen(a);
			int i=0;//表示模式串 
		    int j=0;//表示主串 
		    //模式串匹配 
		    while(j<l3){
			   if(s[i]==a[j]+32||s[i]==a[j]-32||s[i]==a[j]){
				  i++;
				  j++;
			   }else{
				  j=j-i+1;
				  i=0;
			   }
			   if(i>=l1){ 
			       int pos=j;
			       for(int k=0;k<l1;k++){
				       a[--pos]=' ';
				   }
				   //printf("j=%d\n",j);
			       i=0;
		       }
	        }
		    for(int i=0;i<l3;i++){
		    	if(a[i]!=' '){
		    		printf("%c",a[i]);
		    	}
		    }
		    printf("\n");
   } 
   return 0;
}


 

0.0分

3 人评分

  评论区

  • «
  • »