c语言求两个字符串的交集

目录
  • 一、main()函数
  • 二、fun1()函数
  • 三、fun2()函数
  • 注意;
  • 总结

求两个字符串的交集,看似简单,实则需要考虑的细节很多。

我的思路:

1.将两个字符串简化,将里面重复的字母减少为一个。

2.拼接两个字符串,借助循环把重复出现两次的字符找出来。

有了思路开始写代码。

一、main()函数

思路:

1.定义两个储存字符串的数组tt[M],pp[M]

2.定义指针*p接收fun2() 返回值,输出交集

3.输入两个字符串(此处注意越界问题)

4.调用函数

5.输出交集

#include <stdio.h>
#include <string.h>             //用到strcat(),strlen()函数

#define M 50

void fun1(char tt[]);           //将字符串中相同的字母去掉
char *fun2(char tt[]);          //将重复的(子集)找出来

int main()
{
    char tt[M],pp[M];           //定义两个数组,储存字符串
    char *p;                    //接受fun2()返回的地址,并输出交集字符串
    int i;

    gets(tt);                   //abcdef123abc12
    gets(pp);                   //acef123ace124
    fun1(tt);                   //调用函数
    fun1(pp);
    //printf("%s\n",tt);        //供检验使用
    //printf("%s\n",pp);
    strcat(tt,pp);
    //printf("%s\n",tt);
    p=fun2(tt);                 //调用函数
    for(i=0;*(p+i)!='\0';i++)
    {
        printf("%c",*(p+i));    //acef123
    }

    return 0;
}

二、fun1()函数

fun1()作用是将字符串中重复的字符只保留一个

思路:

1.先将重复出现的字符出去第一次出现那个都换成' '(此处为一个空格)

2.在将字符串数组元素移动,去除' '(空格)

void fun1(char tt[])            //将重复的字符抹掉
{
    int i,j;
    char ch;

    for(i=0;i<M;i++)
    {
        if(tt[i]!=' ')          //确保确定的这一项不是空格
        {
            ch=tt[i];           //确定第一次出现的字符
            for(j=i+1;j<M;j++)  //在他后方寻找
            {
                if(ch==tt[j])   //遇到一样的
                tt[j]=' ';      //用' '替换
            }
        }
    }
    for(i=0;i<strlen(tt);i++)
    {
        if(tt[i]==' ')                  //找到' '位置
        {
            for(j=i;j<strlen(tt)-1;j++) //去除' '
            tt[j]=tt[j+1];
            tt[j]='\0';                 //此时最后一项与倒数第二项相同,用'\0'彻底抹除左后一
                                        //项(目的是去除' '字符串缩短)
            i--;
        }                               //防止连续出现多个' '(假如没有i--,此时tt[i]仍然为'
                                        //'运行下一步为i++,这个空格就被保留下来了)
    }
}

三、fun2()函数

fun2()将重复出现的字符挑出来

思路:

1.找到相同字符,并储存在static aa[M]中(小重点)

2.返回第一个字符的地址

char *fun2(char tt[])           //确定子集字符串,返回字符串第一个字符的地址
{
    int i,j,k;
    char ch;
    static char aa[M];          //静态变量,保证调用函数结束后数组还在
    char *p;

    k=0;

    for(i=0;i<strlen(tt);i++)
    {
        ch=tt[i];                       //确定第一次出现的字符
        for(j=i+1;j<strlen(tt);j++)
        {
            if(ch==tt[j])               //如果再次出现一个相同的字符将他赋值给aa[M]数组
            {
                aa[k]=ch;
                k++;
            }
        }
    }
    aa[k]='\0';                         //最后加上'\0'一来这是个字符串,二来main()函数中作为
                                        //for循环结束条件
    p=&aa[0];                           //确定第一个字符的地址

    return p;                           //返回地址
}

注意;

这个代码任然后缺陷,因为用这个代码求得两个字符串的交集永远不会出现空格。

其他思路推荐:

先在第一个字符串中确定一个字符,在第二个字符串中查找是否存在相同字符串

这条思路特要注意字符串中字符重复出现带来的影响

总结

到此这篇关于c语言求两个字符串的交集的文章就介绍到这了,更多相关c语言字符串交集内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • c语言中字符串与字符串数组详解

    目录 字符串 字符串输出 输入字符串 字符串常用方法 字符串数组 总结 字符串 用双引号引起来的就是字符串,字符串由字符组成 字符串使用%s格式化输出 字符串以\0结尾,没有\0就不是字符串 只要是用双引号括起来的都是字符串 字符串的本质就是数组 注意: 字符串变量和普通的字符数组有一定的区别,C语言规定,字符串必须以\0结尾(作为字符串的结束符号),所以字符串变量的元素个数比字符数组的元素多一个\0 #include <stdio.h> int main(int argc, const ch

  • 实现C语言常用字符串库函数

    目录 strlen strcpy strcat strcmp 总结 strlen 数组长度的计算是通过strlen来的,它的作用就是判断给定的数组元素个数,直到碰到\0结束 函数原型 size_t strlen ( const char * str ); 废话少说,直接上代码 int my_strlen(char *str) { char* ch=str; int count=0; while(*ch!='\0') { count++; ch++; } return count; } 但考虑到安

  • c语言求两个字符串的交集

    目录 一.main()函数 二.fun1()函数 三.fun2()函数 注意; 总结 求两个字符串的交集,看似简单,实则需要考虑的细节很多. 我的思路: 1.将两个字符串简化,将里面重复的字母减少为一个. 2.拼接两个字符串,借助循环把重复出现两次的字符找出来. 有了思路开始写代码. 一.main()函数 思路: 1.定义两个储存字符串的数组tt[M],pp[M] 2.定义指针*p接收fun2() 返回值,输出交集 3.输入两个字符串(此处注意越界问题) 4.调用函数 5.输出交集 #inclu

  • C语言求两个字符串的最长公共子串

    本文实例讲述了C语言求两个字符串的最长公共子串的方法.分享给大家供大家参考.具体实现方法如下: #include "stdio.h" #include "string.h" #include "stdlib.h" void getCommon(char str1[],char str2[],char * str3); int stringLength(char * str); void main(){ char str1[50]; char st

  • SQLServer中求两个字符串的交集

    使用javascript的数组来计算,代码如下: 复制代码 代码如下: use tempdb go if (object_id ('fn_getArray' ) is not null ) drop function dbo . fn_getArray go create function fn_getArray (@ inStr1 varchar (8000 ), @ inStr2 varchar (8000 )) returns varchar (8000 ) as begin declar

  • Python实现求两个csv文件交集的方法

    本文实例讲述了Python实现求两个csv文件交集的方法.分享给大家供大家参考,具体如下: #!/usr/bin/env python rd3 = open('data_17_17_2.csv') base = open('data_17_17_3.csv') wr3 = open('delNoBuyed3DayAndStoreAndInCar4.5.2.csv','w+') bsData = base.readlines() i = 1 for key in rd3: if key in bs

  • java实现字符串匹配求两个字符串的最大公共子串

    本文实例讲述了java实现求两个字符串最大公共子串的方法.分享给大家供大家参考,具体如下: 最近在项目工作中有一个关于文本对比的需求,经过这段时间的学习,总结了这篇博客内容:求两个字符串的最大公共子串. 算法思想:基于图计算两字符串的公共子串.具体算法思想参照下图: 输入字符串S1:achmacmh    输入字符串S2:macham 第a步,是将字符串s1,s2分别按字节拆分,构成一个二维数组: 二维数组中的值如b所示,比如第一行第一列的值表示字符串s2和s1的第一个字节是否相等,若相等就是1

  • java实现求两个字符串最长公共子串的方法

    本文实例讲述了java实现求两个字符串最长公共子串的方法.分享给大家供大家参考,具体如下: 这个是华为OJ上的一道题目.首先,如果我们用java写代码,华为OJ有以下三条规则需遵守,否则编译无法通过或者用例无法通过,规则如下: (1)一定不可以有包名: (2)主类名只能为Main: (3)不可以输出与结果无关的信息. 好了,按照以上规则,我们写出来的代码如下(此代码不是最优的,只是用来记录华为OJ上java代码的书写规则): import java.util.Scanner; public cl

  • PHP实现求两个字符串最长公共子串的方法示例

    本文实例讲述了PHP实现求两个字符串最长公共子串的方法.分享给大家供大家参考,具体如下: 前面一篇PHP实现求解最长公共子串问题的方法是基于java改进而来,这里再来看另一种公共子串算法. 代码如下: <?php $a = 'abceee12345309878'; $b = 'abceeew2345i09878fsfsfsfabceeewsfsdfsfsabceeew'; $c = array(); $lenht1 = strlen($a); $lenth2 = strlen($b); $sta

  • 使用python语言,比较两个字符串是否相同的实例

    在编写一些小程序时,我需要比较两个字符串是否相同.一开始的思路是使用ord()函数获取字符的整数表示,但是调试过后发现,ord()函数传入的汉字.英文.或者数字,必须是单个的文字,而不能是一个长度大于1的字符串.ipython给的报错是这样的 TypeError: ord() expected a character,but string of lenth 4 found 这也提醒了我,我的python编程基础不是很牢固,一些基本的函数特性没有弄清楚.今后一定要多多注意. 知道了问题出在哪里,就

  • python实现求两个字符串的最长公共子串方法

    如下所示: # coding:utf-8 ''' 求两个字符串的最长公共子串 思想:建立一个二维数组,保存连续位相同与否的状态 ''' def getNumofCommonSubstr(str1, str2): lstr1 = len(str1) lstr2 = len(str2) record = [[0 for i in range(lstr2+1)] for j in range(lstr1+1)] # 多一位 maxNum = 0 # 最长匹配长度 p = 0 # 匹配的起始位 for

  • C语言求两个正整数的最大公约数示例代码

    目录 前言 1.穷举法 2.欧几里得算法(辗转相除法) 3.递归方法 附:相减法 总结 前言 两个正整数的最大公约数(Greatest Common Divisor, GCD)是能够整除这两个整数的最大整数.两个正整数的最大公约数的求法有多种解答,本文就三种方法做详细介绍:穷举法.欧几里得算法(辗转相除法).递归方法. 我们从一道问题来引入:编写计算最大公约数的函数Gcd(),在主函数中调用该函数计算并输出从键盘任意输入的最大公约数. 1.穷举法 根据最大公约数的定义,我们可以采用一种最简单的方

随机推荐