C比较两个字符串中的不同的字符串



学过C++和Python之后,再回过头来练习C语言的编写,真的是各种问题。果然能把C语言玩的溜的人都是大神级的。主要是要有一个良好的编程习惯。

首先来解析一下编程的题目:

题目很简单:有字符串A和字符串B,假定s("I am a student"),t("am a"),那么程序的输出结果为C("I","student"),也即t字符串是取自s中的一部分,将s中不在t中的单词输出出来。

编程思想:结果存储在一个char**类型的变量中。即指向字符串地址的指针。该指针指向char*类型,而char*存储的是结果的一组字符串的每个字符串的首地址。这样说应该很让人晕,从另一方面来说明,可以用这样的char[][]方式来理解,char[][]本质上是char**类型,比如:

char C[][]={“I”,“student”}

这样确定的函数的传入参数和传出参数:

char** missingWords(char* s, char* t, int* result_size)

其中,s是初始字符串,t是从s中截取一些单词的字符串,result_size是结果字符串的长度,传入地址是为了函数结束时结果被释放。

函数的大致步骤:

1、判断传入的单词是否在t中,不在,则把该单词作为一个独立的字符串,存在一个动态分配的内存中,将该内存的地址传给结果当中;

2、如果在t中,就把该单词过滤掉。

以下是具体的实现过程;

#include<stdio.h>
#include<stdlib.h>

char** missingWords(char* s, char* t, int* result_size) {
	char** result=(char**)malloc(3*sizeof(char*));//先给result动态分配内存
	//char* result[]={NULL,NULL,NULL};开始的时候一直用这种方法初始化result,但是总是运行报错,或者输出乱码。
	char* str=NULL;//中间缓存
	int i=0;//s字符串的索引
	int j=0;//t字符串的索引
	while(*(s+i)!='\0'){  //
		if(*(s+i)!=*(t+j)){//不同单词时
			int m=0;
			//str=s+i; //开始的想法是直接将地址复制过去,但其实这是一种非常危险的动作,因为你后续改动的动作都会影响初始的指针,会导致错误
			char* str=(char*)malloc(15*sizeof(char));//给str分配动态内存,最大15个字符
			while((*(s+i)!=' ')&&(*(s+i)!='\0')){
				*(str+m)=*(s+i);
				m++;
				i++;
			}
			*(str+m)='\0';//手动加一个字符串结束符
			*(result+*result_size)=str;//将str的地址赋给result的下一个字符地址
			*result_size+=1;
		}
		else {
			while((*(t+j)!=' ')&&(*(s+i)==*(t+j))&&(*(t+j)!='\0')){ //遇到相同字符时
				j++;
				i++;
			}
			if(*(t+j)!='\0'){
				j++;
			}
		}
		if(*(s+i)!='\0')
			i++;
		else break;
		
	}
	
	return result;
}



int main(){
	int m=0;
	char* a="i am jj st nn";
	//printf("%d",a);
	char* b="am st";
	char** c;
	
	int d=0;
	c=missingWords(a,b,&d);
	while(m<d){
		printf("%s\n",*(c+m));
		m++;
	}

}


结果:

难点:内存的分配上,因为缺少编程经验,会很容易在指针上出问题,一些意想不到的问题容易发生。我主要的时间是花在纠结那些栈溢出的问题,以及输出乱码上了,其实编译很容易通过,主要的问题是出在运行时,内存地址管理上了。其实以上的程序还有一个不好的地方是没有释放动态内存。

总结:在编写程序的时候,尽量使用动态内存的分配

char** result=(char**)malloc(3*sizeof(char*));
char* result[]={NULL,NULL,NULL};

这个地方是坑我最深的地方,平时没有养成一个良好的编程习惯是多么的可怕,因为char**类型没有初始化的话,会报错,所以,我就随意给它赋空指针,但是,其实这样运行时总是报错,输出第一个字符串时还好,但是输出第二时就会出现乱码。


为什么导致这样的结果,我也很奇怪,还指望哪位大牛能指点一二。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值