| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 648 人关注过本帖
标题:c和指针 又一个题目 <感觉自己很笨,代码写的很繁琐,而且传入参数为'\0'时 ...
取消只看楼主 加入收藏
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
结帖率:99.76%
收藏
已结贴  问题点数:30 回复次数:7 
c和指针 又一个题目 <感觉自己很笨,代码写的很繁琐,而且传入参数为'\0'时,程序直接崩溃了>
程序代码:
#include <stdio.h>
/*
  c和指针习题二:
  函数首先应该判断substr是否在str中,如果它并未出现 则返回0
  如果出现了,则函数应该把str中位于该子串后面的所有字符复制
  到该子串位置,然后返回1,如果substr多次出现于str中,则后面
  的被忽略,也就是只有第一个被覆盖,函数的第二个参数绝对不能
  被修改。
  要求1、要使用指针操作字符串而不是使用数组下标
  要求2、不能使用已知的库函数操作字符串
  提示1、空字符串是每个字符串的子串,也就是说如果第2个参数是
         空字符串 则源串不发生变化
*/
int del_substr(char* str,const char* substr)
{
    /*
    if(*substr=='\0')    //这个比较会导致程序崩溃
    {
        return 0;
    }
    */
    int i=0,j;
    int s_len=0;
    int sub_len=0;
    bool flag=true;   //标记子串是否在源串中
    char* p_s=str;    //临时指针
    const char* p_sub=substr;  //临时指针
    while(*p_s!=NULL)
    {
        s_len++;
        *p_s++;
    }  //计算源串长度
    while(*p_sub!=NULL)
    {
        sub_len++;
        *p_sub++;
    }  //计算子串长度
    p_sub=substr;
    p_s=str;
    if(sub_len>=s_len) return 0;  //如果子串长度大于等于源串长度 直接返回
     while(i<s_len-sub_len)
    {
        for(j=0;j<sub_len;j++)  //这个循环用于判断子串是否在源串之间被包含
        {
            if(*p_s!=*p_sub)
            {
                flag=false;
                break;
            }
            *p_s++;
            *p_sub++;
        }
        if (flag==true)     //下面几句代码实现的是子串后面的串向前移动
        {
            char* p_tmp=str+sub_len;
            for(j=0;j<s_len-sub_len-i;j++)
            {
                *str=*p_tmp;
                str++;
                p_tmp++;
            }
            *str='\0';
            return 1;
        }
        i++;               //下面几句也是用于用于判断子串是否在源串之间被包含
        if(i!=s_len-sub_len) flag=true;
        p_sub=substr;
        p_s=++str;         //一个一个的移动源串指针 用于用于判断子串是否在源串之间被包含
    }
     return 0;
}

int main(void)
{
    char a[]="abcdefgfgjldk";   //看起来这个只能用数组传入了,否则无法移动子串
                                //那么前一道题目如果用数组传入 将会变得很简单
    char* b="1234";
    char* c="def";
    char* d='\0';
    int i=0,j=0;
    //i=del_substr(a,b);
    j=del_substr(a,c);     //这个语句可以测试成功
    printf("%s\n",a);
    //j=del_substr(a,d);    //这个语句无法测试成功
    //printf("%s\n",a);
    return 0;
}
搜索更多相关主题的帖子: 字符串 
2012-12-02 00:03
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
样例:
char a[]="abcdefgfgjldk";
char* c="def";
输出后结果为:其实就相当于把def删除了
abcgfgjldk

DO IT YOURSELF !
2012-12-02 00:06
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用azzbcc在2012-12-2 01:30:25的发言:

只想说:楼主闲的蛋疼!
好吧,我也闲的蛋疼!

疑惑:把str中位于该子串后面的所有字符复制到该子串位置,咋感觉和 2楼样例差距恁大,我理解错了?
纠正:char* d='\0'; 这里 d是指向字符的指针,不是字符串,所以程序崩溃了



以下是引用wp231957在2012-12-2 00:06:24的发言:

样例:
char a[]="abcdefgfgjldk";
char* c="def";
输出后结果为:其实就相当于把def删除了
abcgfgjldk
这里字符串被砍成几块abc不用说了 不能动的 def 被发现的
gfgjldk是字串以后的字符串把它移动到def的d位置

DO IT YOURSELF !
2012-12-02 06:09
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用azzbcc在2012-12-2 01:30:25的发言:

只想说:楼主闲的蛋疼!
好吧,我也闲的蛋疼!

疑惑:把str中位于该子串后面的所有字符复制到该子串位置,咋感觉和 2楼样例差距恁大,我理解错了?
纠正:char* d='\0'; 这里 d是指向字符的指针,不是字符串,所以程序崩溃了
谢谢,程序崩溃的原因找到了

DO IT YOURSELF !
2012-12-02 06:14
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用azzbcc在2012-12-2 10:12:29的发言:

蒽,确实加个 * 多此一举了
但是为啥能得到正确结果呢

DO IT YOURSELF !
2012-12-02 11:28
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
strlen可以自己实现

DO IT YOURSELF !
2012-12-02 11:48
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用embed_xuel在2012-12-2 12:01:36的发言:

一个"*"说明楼主对指针不熟,多练习吧
是的,不熟悉,我主要靠调试

DO IT YOURSELF !
2012-12-02 12:39
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
程序代码:
#include <stdio.h>
#include <malloc.h>
#include <time.h>
#include <stdlib.h>
#define max 50000000

int is_substr(char* str,const char* substr)
{
    int i=0,j;
    int s_len=0;
    int sub_len=0;
    bool flag=true;   //标记子串是否在源串中
    char* p_s=str;    //临时指针
    const char* p_sub=substr;  //临时指针
    while(*p_s!=NULL)
    {
        s_len++;
        p_s++;
    }  //计算源串长度
    while(*p_sub!=NULL)
    {
        sub_len++;
        p_sub++;
    }  //计算子串长度
    p_sub=substr;
    p_s=str;
    if(sub_len>=s_len) return 0;  //如果子串长度大于等于源串长度 直接返回
    while(i<s_len-sub_len+1)     //更正原来的一个bug增加一个(长度+1)
    {
        for(j=0;j<sub_len;j++)  //这个循环用于判断子串是否在源串之间被包含
        {
            if(*p_s!=*p_sub)
            {
                flag=false;
                break;
            }
            p_s++;
            p_sub++;
        }
        if (flag==true)     //找到字串直接返回
        {
           return 1;
        }
        i++;               //下面几句也是用于用于判断子串是否在源串之间被包含
        if(i!=s_len-sub_len+1) flag=true;   //更正原来的一个bug增加一个(长度+1)
        p_sub=substr;
        p_s=++str;         //一个一个的移动源串指针 用于用于判断子串是否在源串之间被包含
    }
     return 0;
}


int main()
{
    srand((unsigned)time(NULL));
    clock_t start,finish;
    start=clock();

    char* dest;
    char tmp;
    int i=0;
    dest=(char*)malloc(max);
    //可见字符除了空格外,范围是0x21~~0x7e
    while(i<max)
    {
        tmp=rand()%(0x7e+1);
        if(tmp>=0x21 && tmp<=0x7e)
        {
            dest[i]=tmp;
            i++;
        }
    }
    dest[i]='\0';
    dest[i-1]='D';
    dest[i-2]='C';
    dest[i-3]='B';
    dest[i-4]='A';
    char *test="ABCD";
    i=is_substr(dest,test);
    printf("%d\n",i);
    finish=clock();
    printf("%.3lf\n",((double)finish-start)/1000);

    return 0;
}
感觉这个判断一个字串是否在另一个字串中的函数还可以啊
随机生成了5000万个字符串 并在该字符串中搜索字串
用时不到2秒

DO IT YOURSELF !
2012-12-04 11:45
快速回复:c和指针 又一个题目 <感觉自己很笨,代码写的很繁琐,而且传入参数为' ...
数据加载中...
 
   



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

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