| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 648 人关注过本帖
标题:c和指针 又一个题目 <感觉自己很笨,代码写的很繁琐,而且传入参数为'\0'时 ...
只看楼主 加入收藏
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
结帖率:99.76%
收藏
已结贴  问题点数:30 回复次数:15 
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
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:10 
只想说:楼主闲的蛋疼!
好吧,我也闲的蛋疼!

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


[fly]存在即是合理[/fly]
2012-12-02 01:30
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
程序代码:
while(*p_sub!=NULL)
{
    sub_len++;
    *p_sub++;
}  //计算子串长度
if (!sub_len)    return 0;
//改进一下,嘿嘿
while(*p_s!=NULL)
{
    s_len++;
    *p_s++;
}  //计算源串长度
p_sub=substr;
p_s=str;
if(sub_len>=s_len) return 0;  //如果子串长度大于等于源串长度 直接返回
//为什么等于也返回?等于不是应该把str搞成空串么?


[fly]存在即是合理[/fly]
2012-12-02 01:34
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
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:10 
楼主计算字符串长度用循环的时候都是指针移位的,*p_s++这句对吗?

总有那身价贱的人给作业贴回复完整的代码
2012-12-02 09:27
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
回复 7楼 embed_xuel
蒽,确实加个 * 多此一举了


[fly]存在即是合理[/fly]
2012-12-02 10:12
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
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:10 
程序代码:
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <stdlib.h>

int go_out(char *buffer, const char *out);

int main(void)
{
    char *buffer = "abcdefg";
    char *out = "def";
    int i = 0;

    i = go_out(buffer,out);

    return 0;
}

int go_out(char *buffer, const char* out)
{
    bool answer = false;
    int i = 0;
    int j = 0;
    int n = 0;
    char *temp = NULL;
    char *temp_2 = NULL;

    temp = (char*)malloc(strlen(buffer)+1);
    strcpy(temp,buffer);

    /*找出需要删除的字符并换为空格*/
    for(i=0;i<strlen(buffer);i++)
    {
        for(j=0;j<strlen(out);j++)
        if(buffer[i] == out[j])
        {
            temp[i] = ' ';
            answer = true;
            break;
        }
    }

    /*去空格*/
    j = 0;
if(answer)
{
    for(i=0;i<strlen(buffer);i++)
      if(temp[i] != ' ')
          temp[j++] = temp[i];

    temp[j] = '\0';
    buffer = temp;
    printf("%s\n",buffer);
        return 1;
}
    else
        return 0;
}

额,不准用库函数...坑爹啊...

I have not failed completely
2012-12-02 11:47
快速回复:c和指针 又一个题目 <感觉自己很笨,代码写的很繁琐,而且传入参数为' ...
数据加载中...
 
   



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

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