| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4770 人关注过本帖
标题:求两个字符串的并集的c语言程序?
只看楼主 加入收藏
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
回复 17楼 pangding
如果真要支持中文,开个更大的数组也不是不可行,并且如果用cp936这样以前导字节确定的编码就不太可能了。

My life is brilliant
2012-08-28 22:59
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
不用开更大数组,字节数一样的。考虑中文,麻烦的只是编码,如果用DBCS,考虑高位为1取2byte就可以了,而如果用wchar_t,你的代码根本不用变,对uft-8,那就麻烦了。

授人以渔,不授人以鱼。
2012-08-28 23:02
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
回复 22楼 TonyDeng
也许楼主并没想到支持中文呢,而恰好是您想到了。如果楼主真的需要那再说吧,问题考虑的全面并不是坏事,但是程序员需要在错误中成长。

[ 本帖最后由 lz1091914999 于 2012-8-29 13:42 编辑 ]

My life is brilliant
2012-08-28 23:16
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
所以我说那是更极端的想法,不过这在现实中是常见的,就算编个成绩管理系统之类的作业,中英文混合也是很普遍的。尽早熟悉处理中文环境,好过将来难以扭转观念,因为很多手法是会变的。

授人以渔,不授人以鱼。
2012-08-28 23:24
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
回复 24楼 TonyDeng
恩,这些用Java或C#会更好。

My life is brilliant
2012-08-28 23:30
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:1 
有那么纠结么

我要成为嘿嘿的黑客,替天行道
2012-08-29 08:40
stophin
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:227
专家分:618
注 册:2010-3-26
收藏
得分:0 
感谢T版的提醒,说得很有道理。我当时只是急着想要提供一个思路,并没有想到实际怎么编。
越界的问题,我想可以开辟str1[N],str2[M+N]的数组,但输入时str2只能使用M的大小(用个while结合
getchar一个个写入str2中,当超过M时忽略后面的输入),但结果可以使用M+N的大小,这样可以避免
重新开辟M+N的结果数组,减少M个char的内存消耗。strcat()真的用得不对,str1只有N个大小,
不可能再用strcat。唯一的办法就是,不使用strcat,但仍然用str2做结果,由于str2本身的前M个数据也不能被覆盖,
所以,先处理str1,将结果从str2的最后M+N-1位置开始保存,保存的结果不会超过N个,str1遇到'\0'时结束后,再处理
str2,但从str2的第M-1个位置开始做。如果处理str1时结果刚好保存了N个,那么保存点从M+N-1到了M-1的地方,而str2开始时也是M-1,所以结果不可能覆盖掉str2的原始数据。完成后再将str2首尾调换过来即可。这只是数据结构的问题,处理思路可以用循环检索结果的方法,或者16楼的查表法都可以。
--------------
想了下,如果str2输入的时候是从最从N位置往后面输,直到M+N-1,输入不大于M个字符串,这样输入简单,只要给scanf予str2+N就可以了。而处理时用两个指针,读取数据的指针从N往后读,作为源数据,另一个指针作为保存点从0位置往后移。str1处理完,保存点指针最大到达N,也不会出现覆盖情况。这样做完以后还不用翻转结果,直接加'\0'就OK了。

[ 本帖最后由 stophin 于 2012-8-29 12:05 编辑 ]
2012-08-29 11:21
stophin
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:227
专家分:618
注 册:2010-3-26
收藏
得分:0 
程序代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define N 15    //str1可输入大小
#define M 15    //str2可输入大小


void search_buffer(char *str,char *buffer,char * &p)
{
    char *t=NULL;
    while (*str)
    {
        for (t=buffer;t<p;t++)
        {
            if (*t==*str)
            {
                if (*str&0x80)
                {
                    if (*(t+1)==*(str+1))
                        break;
                }
                else
                    break;
            }
        }
        if (t==p)
        {
            *p++=*str;
            if (*str&0x80)
                *p++=*(str+1);
        }
        if (*str&0x80)
            str++;
        str++;
    }
    return;
}

void and_buffer(char* str1,char* str2, char* buffer)
{
    char* p = buffer;
    search_buffer(str1,buffer,p);
    search_buffer(str2,buffer,p);
    *p = '\0';
    return;
}

int main(void)
{
    char str1[N];
    char str2[M+N];
    printf("请输入两个字符串,我将为其做并集处理:\n");
    char s[10];
    int i=0;
    sprintf(s,"%%%ds",N);
    scanf(s,str1);
    for (i=0;i<N;*(str1+i)&0x80?i+=2:i++);    //中文对齐
    if ((*(str1+N-1)&0x80)&&(i==N+1))        //如果字符串最末尾只有中文高位,则删掉
        *(str1+i-2)='\0';
    fflush(stdin);
    sprintf(s,"%%%ds",M);
    scanf(s,str2+N);
    for (i=0;i<M;*(str2+N+i)&0x80?i+=2:i++);//中文对齐
    if ((*(str2+N+M-1)&0x80)&&(i==M+1))        //如果字符串最末尾只有中文高位,则删掉
        *(str2+N+i-2)='\0';
    printf("%s\n%s\n",str1,str2+N);
    and_buffer(str1,str2+N,str2);
    printf("并集结果:\n%s\n",str2);
    return 0;
}
验证了我27楼的想法,没有问题。而且可以做中文处理..
再次改了下代码,加了中文输入时的处理.

[ 本帖最后由 stophin 于 2012-8-29 21:59 编辑 ]
2012-08-29 12:50
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
老师  楼主的要求是 并集   并集 是要求A B 两个集合 去除相同的 结合不同的,1个饼+1个饼=2个饼 那是完全不同的并集
1个饼+1个饼  变成了半个饼  什么的。

怎么 fflush fprintf();  这个在WINDOW中也能用?

我要成为嘿嘿的黑客,替天行道
2012-08-29 13:27
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
基本的算法 我是这么想的
两个字符STR1 STR 2
在加一个字符 STR3 存放 STR1+STR2的并集
从STR1取1字符放入 STR3中,让再要放进去的字符 一STR3中的字符进行比较 如果不同 放入  如果相同舍弃
就这样读完


我要成为嘿嘿的黑客,替天行道
2012-08-29 13:31
快速回复:求两个字符串的并集的c语言程序?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.045828 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved