镜缘浮影 小人本住在 苏州的城外 家里有屋又有田 生活乐无边

那些年我们一起忘掉的C (十五).字符串交并集

2016-11-24
wilmosfang
c
原文地址 http://soft.dog/2016/11/24/c-basic-15/

前言

熟练运用字符型指针可以灵活操作字符串,将一个任务进行逻辑拆解,分解出元操作,可以获得很好效果


概要


将任意给定的两个字符串取交集取并集

写一个函数将任意给定的两个字符串取交集

函数原型为:

char *jiaoji(char *s,char *s1,char *s2);

若s1: abcddebcdf ==》去重后的s1 abcdef

s2: bcdfgb

则返回的是 s: bcdf

写一个函数将任意给定的两个字符串取并集

函数原型为:

char *bingji(char *s,char *s1,char *s2);

若s1: abcdde

s2: bcdfg

则返回的是 abcdefg

代码注解

#include <stdio.h>
#define LENGTH 20

int findc(char *s,char c) //这个函数用来判断给定的字符是否存在于给定的字符串中
{
	for(; *s != '\0';s++) if( *s == c ) return 1; //遍历s指针指定的字符串,如果其中存在一个字符与给定字符相等就返回整数1
	return 0; //遍历完还没找到就返回整数0
}

char *jiaoji(char *s,char *s1,char *s2)
{
	char *p=s;
	for(; *s1 != '\0';s1++)	//遍历字符型指针s1所指定的字符串
	{
		if ( findc(s2,*s1) == 1 && findc(s,*s1) == 0  )  //如果字符*s1存在于s2(所指定的字符串)中并且不存在于s(所指定的字符串)中
		{
			*p = *s1; //就将*s1字符保存到*p(s所指定的字符型数组)中
			p++; //后移一位,为下一次存储作准备
		}
	}
	*p = '\0'; //加上字符串结束符
	return s; //将结果集的指针返回
}

char *bingji(char *s,char *s1,char *s2)
{
	char *p=s;
	for(; *s1 != '\0';s1++) //遍历字符型指针s1所指定的字符串
	{
		if ( findc(s,*s1) == 0  ) //如果字符*s1不存在于s(所指定的字符串)中
		{
			*p = *s1; //就将*s1字符保存到*p(s所指定的字符型数组)中
			p++; //后移一位,为下一次存储作准备
		}
	}
	for(; *s2 != '\0';s2++) //遍历字符型指针s2所指定的字符串
	{

		if ( findc(s,*s2) == 0  )  //如果字符*s2不存在于s(所指定的字符串)中
		{
			*p = *s2; //就将*s2字符保存到*p(s所指定的字符型数组)中
			p++; //后移一位,为下一次存储作准备
		}
	}
	*p = '\0'; //加上字符串结束符
	return s; //将结果集的指针返回
}


void main()
{	
	char str[LENGTH],st[LENGTH],s[2*LENGTH]="\0"; 
	printf("please input two strings (less then %d length):\n",LENGTH);
	scanf("%s%s",str,st);
	printf("the two strings are : %s %s\n",str,st);
	printf("the jiaoji string is : %s\n",jiaoji(s,str,st));
	printf("the bingji string is : %s\n",bingji(s,str,st));
}

思路

交集就是存在于string1中同时也存在于string2中的那些字符,并集就是存在于string1中或者存在于string2中的那些字符,是否重复就是一个字符是否已经存在于给定字符串中

明白了这些基本概念后,我们只用实现一个可以判断给定字符是否存在于给定字符串中的函数,再加上基本的遍历就可以拼接出上面的功能需求

基础知识点

  • 指针作为函数参数
  • 函数的返回值
原文地址 http://soft.dog/2016/11/24/c-basic-15/

评论