| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 879 人关注过本帖
标题:新手求助,附题目及本人思路,编译成功但执行出错
取消只看楼主 加入收藏
uppermore
Rank: 2
等 级:论坛游民
帖 子:33
专家分:26
注 册:2010-7-20
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:10 
新手求助,附题目及本人思路,编译成功但执行出错
/*
**函数原型:int del_substr(char *str,char const *substr)
**函数首先判断substr是否出现在str中。如果它并未出现,函数就返回0;如果出现,函数应该把str中位于该子串后面的所有字符复制到该子串的位
**置,从而删除这个子串,然后函数返回1.如果substr多次出现在str中,函数只删除第一次出现的子串。不得使用字符串库函数。
**按照do8do8do8的提示改了,运行成功!感谢大家,我可以继续做下一题了,哈哈
*/
#include "stdio.h"
#include "conio.h"
int del_substr(char *str,char const *substr)
{
    /*
    **  p用来执行移动操作,i记录substr的长度,执行比较
    */
    int i = 0;
    char *p = NULL;
    /*
    **  如果任意串为空,就返回0,不执行任何操作
    */
    if(str == NULL || substr == NULL || *str == '\0' || *substr == '\0') return 0;

    while(*str != '\0')
    {
        while(*(str+i) == *(substr+i))
        {
            i++;
            if(*(substr+i) == '\0')
            {
                /*
                **  substr到达串尾,p指向删除substr后的首地址,开始移动复制
                */
                printf("\ni = %d\n",i);
                p = str+i-1;
                printf(“\np = %s\n”,p);
                getch();
                /*
                **    终于发现问题:原来写的是while(p != '\0'),忘了加个*号了
                */
                while(*p != '\0')
                {
                    *str++ = *p++;
                }
                *str = '\0';
                return 1;
            }
        }
        /*
        **    重置 i
        */
        i = 0;
        str++;
    }
    return 0;
}
int main(void)
{
    /*
    ** 测试函数
    */
    int j,key = 0;
    char *c1 = "ABCAEFGSAEFI";
    char *c2 = "AEF";
    char *c3 = "AEG";
    printf("C1 = %s\n",c1);
    printf("C2 = %s\n",c2);
    printf("C3 = %s\n",c3);
    printf("2 = c2 , 3 = c3 ,input your choice : ");
    scanf("%d",&key);
    switch(key)
    {
        case 2:
             j = del_substr(c1,c2);
             if(j == 1) printf("\nNow c1 = %s",c1);
             else printf("\nDo nothing !");
             break;
        case 3:
             j = del_substr(c1,c3);
             if(j == 1) printf("\nNow c1 = %s",c1);
             else printf("\nDo nothing !");
             break;
        default:
             printf("\nINPUT ERROR !");
             getch();
             return 0;
    }
    getch();
    return 1;
}

[ 本帖最后由 uppermore 于 2010-7-20 16:45 编辑 ]
搜索更多相关主题的帖子: 思路 编译 
2010-07-20 14:48
uppermore
Rank: 2
等 级:论坛游民
帖 子:33
专家分:26
注 册:2010-7-20
收藏
得分:0 
p = str + i-1;后面就错了,不知道为什么

[ 本帖最后由 uppermore 于 2010-7-20 15:41 编辑 ]
2010-07-20 15:29
uppermore
Rank: 2
等 级:论坛游民
帖 子:33
专家分:26
注 册:2010-7-20
收藏
得分:0 
回复 3楼 do8do8do8
当然是想*(str+i),不过不是一样的么?好像+优先执行啊
2010-07-20 15:42
uppermore
Rank: 2
等 级:论坛游民
帖 子:33
专家分:26
注 册:2010-7-20
收藏
得分:0 
回复 楼主 uppermore
自己改了好多次,发现有好多错误,那个p=str+i-1是可以执行的
是那个printf("\np = %s\n",p)搞错,写成了printf("\np = %s\n",*p);
2010-07-20 15:46
uppermore
Rank: 2
等 级:论坛游民
帖 子:33
专家分:26
注 册:2010-7-20
收藏
得分:0 
回复 5楼 do8do8do8
#include "stdio.h"
#include "conio.h"
int main()
{
    char *c = "abcdefgh";
    int i = 3;
    if(*c+i == *(c+i)) printf("\nYESYESYES!\n");
    else printf("\nNONONO!\n");
    getch();
    return 0;
}
看下这个,我这边是YES!- -
2010-07-20 15:52
uppermore
Rank: 2
等 级:论坛游民
帖 子:33
专家分:26
注 册:2010-7-20
收藏
得分:0 
回复 5楼 do8do8do8
是我的错,C里面是“ABCD..”他们相差1,所以即使*str+i与*(str+i)效果不同,但是结果还是相同
不过即使把所有类似错误都改了,还是会出错呢
2010-07-20 15:59
uppermore
Rank: 2
等 级:论坛游民
帖 子:33
专家分:26
注 册:2010-7-20
收藏
得分:0 
回复 9楼 do8do8do8
额,发现了,不过即使改了也还是....
2010-07-20 16:04
uppermore
Rank: 2
等 级:论坛游民
帖 子:33
专家分:26
注 册:2010-7-20
收藏
得分:0 
*str++ = *p++ ;
是这句错了,但问什么
2010-07-20 16:19
uppermore
Rank: 2
等 级:论坛游民
帖 子:33
专家分:26
注 册:2010-7-20
收藏
得分:0 
回复 11楼 do8do8do8
我已经表明立场了,重新编辑了帖子
但还是不行,就是这个 *str++ = *p++ ,搞得指令出错了
不过我相信这句没逻辑错误的,是先取内容,然后指针自加1
2010-07-20 16:23
uppermore
Rank: 2
等 级:论坛游民
帖 子:33
专家分:26
注 册:2010-7-20
收藏
得分:0 
回复 11楼 do8do8do8
OK了,知道问题在哪了,在原帖里改了回来
谢谢你了
2010-07-20 16:38
快速回复:新手求助,附题目及本人思路,编译成功但执行出错
数据加载中...
 
   



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

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