| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 994 人关注过本帖
标题:删除s1数组里与s2数组相同的字符。有一行代码有点不明白
只看楼主 加入收藏
a132266
Rank: 2
等 级:论坛游民
帖 子:86
专家分:20
注 册:2015-3-26
结帖率:66.67%
收藏
 问题点数:0 回复次数:11 
删除s1数组里与s2数组相同的字符。有一行代码有点不明白
/**************************************************************************
    类型:<c程序设计语言(第二版.新版)> 练习 2-4
    名称:lx.c
    author: wubenzhimu
    data:   2012.11.16
    功能:重新编写函数squeeze(s1,s2),将字符串s1中任何与字符串s2中字符匹配
    的字符都删除。
***************************************************************************/

#include <stdio.h>
#define MAXLINE 1000

/* 比较两个字符串,删除匹配的字符 */
void squeeze(char s1[], char s2[]);

int main()
{
    char s1[MAXLINE] = {'a','b','c','d','e','f','g','h','i','k',0};
    char s2[MAXLINE] = {'a','c','e','g','i',0};
   
    squeeze(s1, s2);
    printf("%s\n", s1);
    return 0;
}

void squeeze(char s1[], char s2[])
{
    int i, j, k;
    i = j = k = 0;
   
    while(s2[j] != '\0')
    {
        while(s1[i] != '\0')   
        {
            if(s2[j] != s1[i])         s2[j] 在第2个while 循环里永远是 s2[0]  s2[0] !=s1[0-最后]  
                s1[k++] = s1[i];          s1[k] 记录了 s1[i] 里面去掉s2[0] 的所有字符
            i++;                                       
        }
        s1[k] = '\0';                s1[k] 不是记录了 s1数组里面最后一个元素字符吗。 如果s1[k] 最后一个字符 ='\0' 那不是消失了一个字符      
        i = k = 0;
        j++;
    }
}
搜索更多相关主题的帖子: c程序设计 include 字符串 
2015-05-10 22:48
a132266
Rank: 2
等 级:论坛游民
帖 子:86
专家分:20
注 册:2015-3-26
收藏
得分:0 
s1[k] = '\0';                s1[k] 不是记录了 s1数组里面最后一个元素字符吗。 如果s1[k] 最后一个字符 ='\0' 那不是消失了一个字符
  只是程序运行 正确无比  但是就是不明白这里 有点不懂
2015-05-10 22:49
a132266
Rank: 2
等 级:论坛游民
帖 子:86
专家分:20
注 册:2015-3-26
收藏
得分:0 
坐等坐等  琢磨了一下午了
2015-05-10 22:52
传哥
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2015-5-10
收藏
得分:0 
回复 楼主 a132266
你的这个算法有错!你看哦,你的第二个while循环中
while(s2!='\0'
{
  if(s2[j]!=s1[i])
     s1[k++]=s1[i++];
  i++;
}
s1[k++]=s1[i++];这个语句的作用是什么?
你学了数据结构没有,里面的顺序表的删除里面有一个算法,我给你解析一下
就是按照你的目的呢,你应该拿s1数组的值一个个和s2比较,找到他们相等的,然后找到呢,就把s2数组之后的每一个数组元素都向前移动一个位置,知道s1的值为‘\0’
我也是大一的,如果有什么还不懂的可以联系我,一起进步.
2015-05-10 23:29
·charles
Rank: 2
等 级:论坛游民
帖 子:67
专家分:48
注 册:2015-3-23
收藏
得分:0 
s1[k++] = s1[i];

每次判断之后,先将s1[i]的值给s[k],然后k=k+1,也就是说,数组下标已经后移一位了

编程!编程!!编程!!!
重要的事情说三遍!!!!
2015-05-10 23:53
a132266
Rank: 2
等 级:论坛游民
帖 子:86
专家分:20
注 册:2015-3-26
收藏
得分:0 
回复 4楼 传哥
我没学过数据结构 初学C   不过你解释错了啊
删除s1 里面与s2相同的字符


是拿s2[0] 比较s1[i]里面所有的元素
如果不相同的就存储在s1[k]里面 相同的就不存储进来
2015-05-11 01:07
a132266
Rank: 2
等 级:论坛游民
帖 子:86
专家分:20
注 册:2015-3-26
收藏
得分:0 
回复 4楼 传哥
我们联系联系 有问题一起商量商量。


如果按 你说的 取 s1[0]的字符去与  s2的所有字符比较 是行不通的, 因为倘若s1[0]与s2里面的某个相同  但是你怎么去掉s1[0]这个字符呢
2015-05-11 01:09
a132266
Rank: 2
等 级:论坛游民
帖 子:86
专家分:20
注 册:2015-3-26
收藏
得分:0 
回复 4楼 传哥
184235374qq
2015-05-11 01:11
a132266
Rank: 2
等 级:论坛游民
帖 子:86
专家分:20
注 册:2015-3-26
收藏
得分:0 
回复 5楼 ·charles
谢谢 就是这里自己理解的不踏实, 刚才看了你说的  琢磨了下 一下明白了
2015-05-11 01:14
helloUJS
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:168
专家分:731
注 册:2013-3-27
收藏
得分:0 
修改了一下,供参考:
#include <stdio.h>
#define MAXLINE 1000

/* 比较两个字符串,删除匹配的字符 */
void squeeze(char s1[], char s2[]);

int main()
{
    char s1[MAXLINE] = {'a','b','c','d','e','f','g','h','i','k',0};
    char s2[MAXLINE] = {'a','c','e','g','i',0};
   
    squeeze(s1, s2);
    printf("%s\n", s1);
    return 0;
}

void squeeze(char s1[], char s2[])
{
    int i, j, k,fg;
    k=0;
    for(j=0;s1[j]!='\0';j++)
    {
        fg=1;
        for(i=0;s2[i]!='\0';i++)
           if(s1[j]==s2[i])
                fg=0;
        if(fg)  s1[k++]=s1[j];
     }
     s1[k]='\0';
}
2015-05-11 20:31
快速回复:删除s1数组里与s2数组相同的字符。有一行代码有点不明白
数据加载中...
 
   



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

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