回 帖 发 新 帖 刷新版面

主题:串赋值

#include <stdio.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
typedef int Status;
#define NULL 0
typedef struct
{char *ch;//若是非空串,则按串长分配存储区,否则 ch 为NULL
 int length;
}HString;
//-----------------------基本操作----------------------------------
Status StrAssign(HString &T,char *chars)
{//生成一个其值等于串常量chars的串T
 int i,j; 
 if(T.ch) free(T.ch);
 for(i=0;chars[i];i++);//求chars的长度i
 if(!i){T.ch=NULL;T.length=0;}
 else
 {T.ch=(char*)malloc(i*sizeof(char));
 if(!T.ch) return ERROR;
  for(j=0;j<=i-1;j++) T.ch[j]=chars[j]; 
  T.ch[j]='\0';
  T.length=i;}
 return OK;
}//StrAssign
main()
{HString T,s1,s2;
int i,pos,len;
char c[100];
printf("请输入一个字符串:");
scanf("%s",c);
StrAssign(T,c);
printf("\n请输出该字符串:");
for(i=0;i<T.length;i++)
printf("%c",T.ch[i]);

}
程序调试不出来,请高手指点一下

回复列表 (共7个回复)

沙发

Status StrAssign(HString &T,char *chars)
{//生成一个其值等于串常量chars的串T
 int i,j; 
 if(T.ch) free(T.ch);
 for(i=0;chars[i];i++);//求chars的长度i
 if(!i){T.ch=NULL;T.length=0;}
 else
 {T.ch=(char*)malloc((i+1)*sizeof(char));//你要留一个出来放末尾的'\0'
 if(!T.ch) return ERROR;
  for(j=0;j<=i-1;j++) T.ch[j]=chars[j]; 
  T.ch[j]='\0';
  T.length=i;}
 return OK;
}//StrAssign

板凳

程序调试不出来,还有一个主要的原因是:你在c程序中应用了c++的东西

Status StrAssign(HString &T,char *chars)//“&”是c++中的引用类型,在c中要用指针来代替

3 楼

按照大家的说的做了相应的修改,编译通过了,但在调用StringAssign()时仍出错!郁闷啊

4 楼

没有初始化

5 楼

#include "string.h"
#include "stdlib.h"
#include "stdio.h"
#define ok 1
#define error 0


typedef struct 
{
    char *ch;//不以'/0'作为结束
    int length;
}HString;


//初始化串(定义变量时必须初始化)
void ini_str(HString &s)
{
    s.ch=NULL;
    s.length=0;
}


//生成一个其值等于串常量chars的串T
bool str_assign(HString &T,char *chars)//
{
    int count=0;
    if(T.ch)
        free(T.ch);
    while(chars[count]!=NULL)
        count++;//count是字符串的字符数
    if(!(T.ch=(char *)malloc(sizeof(char)*count)))
        exit(1);
    for(int i=0;i<count;i++)
        T.ch[i]=chars[i];
    T.length=count;
    return(ok);
}
    
//返回串的长度
int str_length(HString T)
{
    return(T.length);
}

//若s>t,则返回值>0.s=t,则返回值=0.s<t,则返回值<0.
int str_compare(HString s,HString t)
{
    int i=0;
    while(i<s.length&&i<t.length)
    {
        if(s.ch[i]>t.ch[i])
        {
            return(1);
            break;
        }
        else if(s.ch[i]<t.ch[i])
        {
            return(-1);
            break;
        }
        else
            i++;
    }
    if(s.length>t.length)
        return(1);
    else if(s.length<t.length)
        return(-1);
    else
        return(0);
}

//将s清为空串,并释放s所占空间
bool str_clear(HString &s)
{
    free(s.ch);
    s.ch=NULL;//别忘了
    s.length=0;
    return(ok);
}


//用t返回由s1,s2联结而成的新串
bool str_cat(HString s1,HString s2,HString &t)
{
    t.length=s1.length+s2.length;
    if(!(t.ch=(char *)malloc(sizeof(char)*t.length)))
        exit(1);
    for(int i=0;i<s1.length;i++)
        t.ch[i]=s1.ch[i];
    for(int j=0;j<s2.length;j++)
        t.ch[s1.length+j]=s2.ch[j];
    return(ok);
}


//返回串s的第pos个字符起长度为len的子串(包括第pos个字符)
bool sub_str(HString s,int pos,int len,HString &sub)
{
    if(pos<1||pos+len-1>s.length)
        return(error);
    sub.length=len;
    if(!(sub.ch=(char *)malloc(sizeof(char)*len)))
        exit(1);
    for(int i=0;i<len;i++)
        sub.ch[i]=s.ch[pos-1+i];
    return(ok);
}

6 楼

因为HString 有一个指针项,所以在调用是要进行初始化

7 楼

#include <stdio.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
typedef int Status;
#define NULL 0
typedef struct
{char *ch;//若是非空串,则按串长分配存储区,否则 ch 为NULL
 int length;
}HString;
//-----------------------基本操作----------------------------------
Status StrAssign(HString *T,char *chars)
{//生成一个其值等于串常量chars的串T
 int i,j; 
 if(T->ch) free(T->ch);
 for(i=0;chars[i]!='#';i++);//求chars的长度i
 if(i==0){T->ch=NULL;T->length=0;}
 else
 {T->ch=(char*)malloc(i*sizeof(char));

  for(j=0;j<=i-1;j++) T->ch[j]=chars[j]; 
  T->ch[j]='\0';
  T->length=i;
 }
 return OK;
}//StrAssign
void main()
{HString T,s1,s2;
int i,pos,len;
char c[100];
printf("请输入一个字符串:");
scanf("%c",&c[0]);
StrAssign(&T,c);
printf("\n请输出该字符串:");
for(i=0;i<T.length;i++)
printf("%c",T.ch[i]);

}
有很多地方用错拉.
你的编程风格有待遇改进!

我来回复

您尚未登录,请登录后再回复。点此登录或注册