标题:还是有问题 谁耐心帮忙看看 VCTC都可以编译无法运行
只看楼主
njzhangyuhao
Rank: 2
等 级:论坛游民
帖 子:197
专家分:35
注 册:2010-11-20
结帖率:100%
已结贴  问题点数:100 回复次数:6 
还是有问题 谁耐心帮忙看看 VCTC都可以编译无法运行
找到单词后 替换成word_tab中后一个单词 不知道哪里错了
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void replace_word(char s[])
{
    char word_tab[4][10]={"sad","happy","accuse","forgive"};
    char temp[10],copys[80];
    int n,m,i,k1,k2,len,q1,q2,j;
    for(n=0,m=0;s[n]!='\0';n++)
    {
        if(s[n]!=' '&&s[n+1]==' ')/*s[m]与s[n]之间是一个单词*/
        {
            for(i=0;i<10;i++)
                temp[i]='\0';
            for(i=0,j=m;j<=n;j++,i++)
            {
                temp[i]=s[j];
            }
            for(i=0;i<4;i++)
                if(!strcmp(temp,word_tab[i]))
                {
                    len=strlen(word_tab[i]);
                    for(k1=m,k2=n+1;s[k2]!='\0';k2++,k1++)/*将这个单词从s数组中删去*/
                    {
                        s[k1]=s[k2];
                    }
                    for(;k1<k2;k1++)
                        s[k1]='\0';
                    for(q1=0;q1<m;q1++)/*将s数组中这个单词前面的字母复制到数组copys中去*/
                        copys[q1]=s[q1];
                    for(q2=m+len,j=0;q1<q2;q1++,j++)/*用新单词替换原单词*/
                    {
                        copys[q1]=word_tab[i==3?0:i+1][j];
                    }
                    for(;s[q2]!='\0';m++,q1++)/*将s数组中这个单词后面的字母接到copys之后*/
                        copys[q1]=s[m];
                    for(;q1<80;q1++)
                        copys[q1]='\0';
                    strcpy(s,copys);
                }
        }
        if(s[n]==' '&&s[n+1]!=' ')
            m=n+1;
    }
}
void main()
{
    char s[80]="I accuse your mistakes.";
    replace_word(s);
    printf("%s\n",s);
}
搜索更多相关主题的帖子: happy 
2011-04-08 10:07
njkido
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:224
专家分:1184
注 册:2011-3-8
得分:0 
检查一下这

for(;s[q2]!='\0';m++,q1++)/*将s数组中这个单词后面的字母接到copys之后*/

F9断点 F10/F11单步 自己调 省分

[ 本帖最后由 njkido 于 2011-4-8 10:28 编辑 ]
2011-04-08 10:26
hnuhsg1226
Rank: 9Rank: 9Rank: 9
来 自:中国
等 级:蜘蛛侠
威 望:2
帖 子:314
专家分:1314
注 册:2011-3-27
得分:0 
这贴貌似以前看到过,能否扼要的说说你的解题思路

我的地盘
2011-04-08 10:53
njzhangyuhao
Rank: 2
等 级:论坛游民
帖 子:197
专家分:35
注 册:2010-11-20
得分:0 
回复 2楼 njkido
我没看出问题啊 ??
2011-04-08 11:06
njkido
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:224
专家分:1184
注 册:2011-3-8
得分:100 
for(;s[q2]!='\0';m++,q1++)/*将s数组中这个单词后面的字母接到copys之后*/
  copys[q1]=s[m];


s[q2]=='\0'是跳出循环条件 问题是循环体内没有对q2和s的任何改变的动作

同时m,q1不断自加 copys[q1]和s[m]不断引用 copys和s一共只有80个byte 所以报memory error
2011-04-08 11:42
autumn1202
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:64
专家分:553
注 册:2011-2-21
得分:0 
2楼说的对,最好还是自己调试下
裸看代码还是有点难
1. len=strlen(word_tab[i]);  =====》len有问题,因为你是用的下一个单词替换,所以要求word_tab下一个单词(当然可能是第0个)的长度
2. for(;s[q2]!='\0';m++,q1++)/*将s数组中这个单词后面的字母接到copys之后*/  这个是二楼说的,q2应该为m,你想想是不是
2011-04-08 11:43
hnuhsg1226
Rank: 9Rank: 9Rank: 9
来 自:中国
等 级:蜘蛛侠
威 望:2
帖 子:314
专家分:1314
注 册:2011-3-27
得分:0 
帮你改顺了,你拿去测试下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *replace_word(char s[])
{
    char word_tab[4][10]={"sad","happy","accuse","forgive"};
    char temp[10]={0},copys[80]={0};    //<-------------改过的
    int n,m,i,k1,k2,len,q1,q2,j,a,l;
    for(n=0,m=0;s[n]!='\0';n++)
    {
        if(s[n]!=' '&&s[n+1]==' ')/*s[m]与s[n]之间是一个单词*/
        {
            for(i=0,j=m;j<=n;j++,i++)
            {
                temp[i]=s[j];
            }
            for(i=0;i<4;i++)
                if(!strcmp(temp,word_tab[i]))
                {
                    len=strlen(word_tab[i]);
                    for(k1=m,k2=n+1;s[k2]!='\0';k2++,k1++)/*将这个单词从s数组中删去*/
                    {
                        s[k1]=s[k2];
                    }
                    s[k1]='\0';          //<-------------改过的     
                    for(q1=0;q1<m;q1++)
                        copys[q1]=s[q1];
                    a=(i==3?0:i+1);       //<-------------改过的
                    l=strlen(word_tab[a]);//<-------------改过的
                    for(j=0;j<l;q1++,j++)   //<-------------改过的
                    {
                        copys[q1]=word_tab[a][j];
                    }
                    for(q2=m;s[q2]!='\0';q2++,q1++)////<-------------改过的
                        copys[q1]=s[q2];
                    return copys;      ////<-------------改过的
                }
        }
        if(s[n]==' '&&s[n+1]!=' ')
            m=n+1;
    }
}
void main()
{
    char s[80]="I accuse your mistakes.";
    char *p;
    p=replace_word(s);
    printf("%s\n",p);
}

我的地盘
2011-04-08 12:32



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-335944-1-1.html




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

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