请问在DELPHI下如何实现:
比如我现在有字符串:S1,S2
S1,S2都是汉字,如何实现如果S1中的汉字在S2中不存在则把此汉字取出写到一个A.txt文件中如:S1:=‘我是一名程序员’;S2:=‘我是一名高级和序员’;则程序运行结果为:‘高级’注:也许S1,S2中有不是汉字,所以在比较时应先做一个检测,谢谢~~

解决方案 »

  1.   

    根据内码吧。按字节取,你看ASCII码在多少以内的就是英文的。你可以找相关资料。
    比如
     var s:string;
      SetLength(S,5);
      s[1] :=Char(189);
      s[2] :=char(211);
      s[3] :=char(183);
      s[4] :=char(214);
      s[5] :=char(0);
      Edit1.Text :=s;以上的字符将是“接分”。
      

  2.   

    S1 := '我是来接分的';
    S2 := '接分的是我来得目的';
    结果是啥?第一天,他们给我注册超靓id,我没灌!
    第二天,他们威胁要把我的电脑黑了,我没灌!
    第三天,他们找了一个plmm和我聊天,我灌了!
    第四天,我还想灌,可论坛被查封了!
    嘻嘻嘻 伴水:)有屎以来最尾大的灌水夹 嘻嘻嘻嘻
      

  3.   

    也可以这么说,现有a.txt b.txt文件,对两个文件进行比较
    若a.txt文件中的汉字在b.txt文件中不存在的汉字则写到一个新的TXT文件中、望高手给出宝贵意见,谢谢
      

  4.   

    对于一些比较小的文件,可以采取遍历的做法procedure TForm1.Button1Click(Sender: TObject);
    var
      i,j : Integer;
      s1,s2,s3 : WideString;
      bExists : Boolean;
    begin
      s1 := Memo1.Lines.Text;
      s2 := Memo2.Lines.Text;
      for i:=1 to Length(s2) do
      begin
        //西文ASCII字符是一个字节,高位必然为0
        //中文字符是两个字节
        if Hi(Ord(s2[i]))>0 then
        begin
          bExists := False;
          for j:=1 to Length(s1) do
          begin
            if (Hi(Ord(s1[j]))>0) and (s1[j]=s2[i])  then
            begin
              bExists := True;
              Break;
            end;
          end;
          if not bExists then
            s3 := s3+ s2[i];
        end;
      end;
      Memo3.Text := s3;
    end;
      

  5.   

    如果s1,s2都不是很长的话可以这样简单处理,至于检测非中文搂住就自己写吧,很简单的,网上有很多资料procedure TForm1.Button1Click(Sender: TObject);
    var
      s1,s2,tmps,mys:WideString;
      len,i:Integer;
    begin
      mys:='';
      s1:='我是中国人';
      s2:='中国真伟大';
      len:=Length(s1);
      for i:=1 to len do
      begin
        tmps:=s1[i];
        if Pos(tmps,s2)=0 then
        mys:=mys+tmps;
      end;
      Edit1.Text:=mys;
    end;
    执行后结果:我是人
      

  6.   

    还可以有一个好方法:调用系统的fc命令
    如比较c:\1.txt 和 c:\2.txt
    fc c:\1.txt c:\2.txt >c:\tmp.txt
    tmp.txt中就是比较结果
      

  7.   

    用POS()函数不能得出正确结果,因为汉字占两个字节,一个高位,一个低位
    用系统命令FC也得不出所要的结果
      

  8.   

    用POS可以啊,WideString就可以了吧,我测试可以的,FC确实不行
      

  9.   

    取交集好象是不准的!!
    初学者,凑个热闹  
    拿个 小分!
    呵呵
    !!!
    begin
      i := length(s1);
      j := length(s2);
      for i := 0 to i do 
        for j := 0 to j do 
          if s1[i] <> s[j] then 
            s := s + s[i];
           
      

  10.   

    我对POS()函数做过测试,问题在这里:
    一个汉字他有高低位组成,比如:有S1:=我是一名程序员,S2:=我是一名大学生
    POS(S1,S2)
    结果为:程序员
    来个假如,如果“员”的高低位为:001002;
    “学”的高低位为:008001,“生”的高低位为:002000
    则“学生”组成的位为:008-----001002-------000
    001002正好是员字的高低位,所以上面的结果就会变成:程序,从而导致结果不正确不知这样分析有没有道理,继续讨论。。
      

  11.   

    1、string和widestring
    一个汉字使用2个字节,一个西文字母使用一个字节存放,
    在string里,length()返回的字符串字节数,如果有汉字,会认为一个汉字是2个字符。
    在widestring里,Length()返回的是实际字符串个数。
    因此,对于中西文混合的字符串,最好用widestring保存,这样取字符时,如果是西文,则取1个字节,如果是汉字则取2个字节。2、判断字符是否汉字
    取出每个字符后,用Ord()可以得到每个字符的内码值,
    可以用取高位值的办法判断是否是汉字。
    凡是2个字节存放的,都是汉字,用一个字节存放的,都是西文,
    因此用hi()检查字符高位值时,2个字节的字符高位都不为0,一个字节的字符,高位必然为0还可以用string,根据汉字编码规范逐个字节进行判断汉字。
    汉字编码范围名称            第一字节                 第二字节
     
    GB2312        0xB0-0xF7(176-247)         0xA0-0xFE(160-254)
     
    GBK           0x81-0xFE(129-254)       0x40-0xFE(64-254)
     
    Big5          0x81-0xFE(129-255)       0x40-0x7E(64-126)
                                             0xA1-0xFE(161-254)
     
      

  12.   

    顶你个胃
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      ShowMessage(IntToStr(Pos('好', '你好'))); //3
      ShowMessage(IntToStr(Pos(WideString('好'), WideString('你好')))); //2
    end;
    我给的代码你调试过没有?调试过\发现什么错误再说话