| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 620 人关注过本帖
标题:大家来找茬!!
只看楼主 加入收藏
跳跳鱼
Rank: 2
等 级:论坛游民
帖 子:74
专家分:60
注 册:2011-5-4
结帖率:93.75%
收藏
已结贴  问题点数:20 回复次数:5 
大家来找茬!!
鄙人刚学数据结构,日前编写一串堆分配操作程序,编译无错,但运行时总是会出现发送错误报告,请各位高手找茬!
ps:具体问题是由键盘输入串问题,main函数中指针问题,以下是程序代码:
程序代码:
#include <iostream>   
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string>
using namespace std;

typedef struct
{
    char *ch;    // 若是非空串,则按串长分配存储区,否则ch为NULL
    int length; // 串长度
}HString;


// 初始化(产生空串)字符串T
void InitString(HString *T)
{
    (*T).length=0;
    (*T).ch=NULL;
}
int StrLength(HString S)
{
    return S.length;
}
// 生成一个其值等于串常量chars的串T
int StrAssign(HString *T, char *chars)
{
    int i,j;
    if((*T).ch)
    free((*T).ch); // 释放T原有空间
    i =strlen(chars); // 求chars的长度i
    if(!i)
    {
        // chars的长度为0
        (*T).ch = NULL;
        (*T).length = 0;
    }
    else
    {
        // chars的长度不为0
        (*T).ch = (char*)malloc(i*sizeof(char)); // 分配串空间
        if(!(*T).ch) // 分配串空间失败
            exit(0);
        for(j = 0; j < i; j++) // 拷贝串
            (*T).ch[j] = chars[j];
        (*T).length = i;
    }
    return 0;
}
int StrEmpty(HString S)
{
    if(S.length == 0 && S.ch == NULL)
        return 1;
    else
        return 0;
}
// 用Sub返回串S的第pos个字符起长度为len的子串。
int SubString(HString *Sub, HString S,int pos,int len)
{
    int i;
    if(pos<1||pos>S.length||len<0||len>S.length-pos+1)
        return 0;
    if((*Sub).ch)
        free((*Sub).ch); // 释放旧空间
    if(!len) // 空子串
    {
        (*Sub).ch=NULL;
        (*Sub).length=0;
    }
    else
    { // 完整子串
        (*Sub).ch=(char*)malloc(len*sizeof(char));
        if(!(*Sub).ch)
            exit(0);
        for(i=0;i<=len-1;i++)
            (*Sub).ch[i]=S.ch[pos-1+i];
        (*Sub).length=len;
    }
    return 0;
}
// 若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0
int StrCompare(HString S,HString T)
{
    int i;
    for(i=0;i<S.length && i<T.length;++i)
        if(S.ch[i] != T.ch[i])
            return S.ch[i]-T.ch[i];
    return S.length-T.length;
}
// T为非空串。若主串S中第pos个字符之后存在与T相等的子串, 则返回第一个这样的子串在S中的位置,否则返回0
int Index(HString S,HString T,int pos)
{
    int n,m,i;
    HString sub;
   
    InitString(&sub);
    if(pos>0)
    {
        n=StrLength(S);                   //n为串s的长度
        m=StrLength(T);                   //m为串t的长度
        i=pos;
        while(i<=n-m+1)    //从第i个位置开始求与T等长的子串,循环直到找到
        {
            SubString(&sub,S,i,m);    //从第i个位置开始求得子串
            if(StrCompare(sub,T)!=0)//将求得的子串与T对比,若不等则i++
                ++i;
            else
                return i;
        }
    }
    return 0;
}


int Concat(HString *T,HString S1,HString S2)
{
    int i;
    if((*T).ch)
        free((*T).ch); // 释放旧空间
    (*T).length=S1.length+S2.length;
    (*T).ch=(char *)malloc((*T).length*sizeof(char));    //分配新串的长度
    if(!(*T).ch)
        exit(0);
    for(i=0;i<S1.length;i++)    //将S1接到新串T的后面
        (*T).ch[i]=S1.ch[i];
    for(i=0;i<S2.length;i++)    //将S2接到新串T的后面
        (*T).ch[S1.length+i]=S2.ch[i];
    return 0;
}

// 从串S中删除第pos个字符起长度为len的子串
int StrDelete(HString *S,int pos,int len)
{
    int i;
    if((*S).length<pos+len-1)          //若串长度小于pos长度与删除字符长度之和则退出
        exit(0);
    for(i=pos-1;i<=(*S).length-len;i++)
        (*S).ch[i]=(*S).ch[i+len];
    (*S).length-=len;
    (*S).ch=(char*)realloc((*S).ch,(*S).length*sizeof(char));
    return 0;
}
// 在串S的第pos个字符之前插入串Ts
int StrInsert(HString *S,int pos,HString T)
{
    int i;
    if(pos<1||pos>(*S).length+1) // pos不合法
        return 0;
    if(T.length) // T非空,则重新分配空间,插入T
    {
        (*S).ch = (char*)realloc((*S).ch,
            ((*S).length+T.length)*sizeof(char));
        if(!(*S).ch)
            exit(0);
        for(i=(*S).length-1;i>=pos-1;--i) // 为插入T而腾出位置
            (*S).ch[i+T.length]=(*S).ch[i];    
        for(i=0;i<T.length;i++)
            (*S).ch[pos-1+i]=T.ch[i]; // 插入T
        (*S).length+=T.length;
    }
    return 0;
}

// 用V替换主串S中出现的所有与T相等的不重叠的子串
int Replace(HString *S,HString T,HString V)
{
    int i=1; // 从串S的第一个字符起查找串T
    if(StrEmpty(T)) // T是空串
        return 0;
    do
    {
        i=Index(*S,T,i); // 结果i为从上一个i之后找到的子串T的位置
        if(i) // 串S中存在串T
        {
            StrDelete(S,i,StrLength(T)); // 删除该串T
            StrInsert(S,i,V); // 在原串T的位置插入串V
            i+=StrLength(V); // 在插入的串V后面继续查找串T
        }
    }while(i);
    return 0;
}
// 输出T字符串
void StrPrint(HString T)
{
    int i;
    for(i=0;i<T.length;i++)
    cout<<T.ch[i];
    cout<<endl;
}

int main()
{
    int i;
    char c,*p,*q,*m,*n;
    HString t,s,r;
    InitString(&t);
    InitString(&s);
    InitString(&r);
    cout<<"请输入串t:";
    cin>>p;
    StrAssign(&t,p);
    cout<<"串t为:";
      StrPrint(t);
      cout<<"请输入串s:";
      cin>>q;
     StrAssign(&s,q);
      cout<<"串s为:";
     StrPrint(s);
    i=StrCompare(s,t);
    if(i<0)
        c='<';
    else if(i==0)
        c='=';
    else
        c='>';
    printf("串s%c串t\n",c);
    Concat(&r,t,s);
   cout<<"串t联接串s产生的串r为: ";
    StrPrint(r);
    cout<<"重新定义串s,请输入串s: ";
    cin>>m;
    StrAssign(&s,m);
    StrPrint(s);
    cout<<"重新定义串t,请输入串t: ";
    cin>>n;
    StrAssign(&t,n);
    StrPrint(t);
    Replace(&r,t,s);
    cout<<"把串r中和串t相同的子串用串s代替后,串r为:";
    StrPrint(r);
    StrInsert(&r,6,s);
    cout<<"在串t的第6个字符前插入串s后,串r为: ";
    StrPrint(r);
    return 0;
}
搜索更多相关主题的帖子: 大家来找茬 
2011-11-07 21:40
跳跳鱼
Rank: 2
等 级:论坛游民
帖 子:74
专家分:60
注 册:2011-5-4
收藏
得分:0 
咋没人捏?自己顶一下!
2011-11-09 18:23
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
自己 一个一个地调试吧
2011-11-10 00:20
跳跳鱼
Rank: 2
等 级:论坛游民
帖 子:74
专家分:60
注 册:2011-5-4
收藏
得分:0 
回复 3楼 寒风中的细雨
就是因为调完了,显示无错误。。。。。。但程序出不来!!出不来呀!
2011-11-10 10:25
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:20 
程序代码:
const unsigned StrSize = 80;//定义字符串的大小
int main()

 {
     int i;
     char c;
     char *p = NULL, *q = NULL, *m = NULL, *n = NULL;
     HString t,s,r;
     InitString(&t);
     InitString(&s);
     InitString(&r);
     cout<<"请输入串t:";
     p = new char[StrSize];
     cin>>p;
     StrAssign(&t,p);
     cout<<"串t为:";
     StrPrint(t);
     cout<<"请输入串s:";
     q = new char[StrSize];
     cin>>q;
     StrAssign(&s,q);
     cout<<"串s为:";
     StrPrint(s);
   
     i=StrCompare(s,t);
     if(i<0)
         c='<';
     else if(i==0)
         c='=';
     else
         c='>';
     printf("串s%c串t\n",c);
     Concat(&r,t,s);
     cout<<"串t联接串s产生的串r为: ";
     StrPrint(r);
   
     cout<<"重新定义串s,请输入串s: ";
     m = new char[StrSize];
     cin>>m;
     StrAssign(&s,m);
     StrPrint(s);
     cout<<"重新定义串t,请输入串t: ";
     n = new char[StrSize];
     cin>>n;
   
     StrAssign(&t,n);
     StrPrint(t);

     Replace(&r,t,s);
     cout<<"把串r中和串t相同的子串用串s代替后,串r为:";
     StrPrint(r);
     StrInsert(&r,6,s);
     cout<<"在串t的第6个字符前插入串s后,串r为: ";
     StrPrint(r);
     return 0;

 }
2011-11-10 13:26
跳跳鱼
Rank: 2
等 级:论坛游民
帖 子:74
专家分:60
注 册:2011-5-4
收藏
得分:0 
回复 5楼 寒风中的细雨
谢谢啦!谢谢啦!撒花!又学到了!!!我没有输入串的长度!学艺不精啊!
2011-11-10 14:58
快速回复:大家来找茬!!
数据加载中...
 
   



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

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