堆分配表示串

//version 2
//因为strlen 求的字符串不包括'\0' 但后面的一些concat函数是连'\0'一块算上的,所以这个写的有点小混乱....
// 如果按书上的方法求长度------for( i = 0, c = chars; c; ++i, ++c ); 应该没有问题
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#define OK -100
#define ERROR -1000
typedef struct
{
	char * ch;
	int length;
}HString;
typedef int Status;
//----------------------------------------------------------
void status_( int sat );
Status StrAssign(HString &T, char * chars);
Status StrLength( HString &T );
Status StrCompare( HString &T, HString S );
Status ClearString( HString &T );
Status Concat( HString &T, HString S1, HString S2 );
//Status SubString( HString &Sub, HString S, int pos, int len);
//------------------------------------------------------------
int main()
{
	int choice, status;
	char chars[256]; //串的初始长度设置为256
	HString T;
	T.ch = NULL;
	puts( "No1 StrAssign" );
	puts( "No2 StrLength" );
	puts( "No3 StrCompare" );
	puts( "No4 ClearString");
	puts( "No5 Concat");
	puts( "No6 SubString");
	printf( "please choose:" );
	scanf( "%d", &choice );
	while(1)
	{
		switch( choice )
		{
			case 1:
				printf( "please tell me a strings(less than 256):" );
				scanf( "%s", chars );
				status = StrAssign( T, chars );
				status_( status );
				break;
			case 2:
				status = StrLength( T );
				status_( status );
				break;
			case 3:
				HString S; //作比较的字符串
				puts( "input another String:");
				scanf( "%s", T.ch );
				status = StrCompare( T, S );
				status_( status );
				break;
			case 4:
				status = ClearString( T );
				status_( status );
				break;
			case 5:
				HString S1, S2;
				//--------------------------------------------------------------------
				printf( "please tell me a strings(less than 256):" );
				scanf( "%s", chars ); //这个初始化函数写的有点小失败...
				status = StrAssign( S1, chars ); //本来想把case 1 的全部都重新再封装一下
				status_( status );
				//-------------------------------------------------------------
				printf( "please tell me a strings(less than 256):" );
				scanf( "%s", chars );
				status = StrAssign( S2, chars );
				status_( status );
				//-------------------------------------------------------------
				status = Concat( T, S1, S2 );
				printf( "%s", T.ch );
				status_( status );
				break;
			case 6:
				status_( status );
				break;
			default:
				break;

		}
		printf( "%s", T.ch );
		printf( "please choose:" );
		scanf( "%d", &choice );
	}
	return 0;
}

void status_( int sat )//status 状态判断
{
	if( OK == sat )
		printf( "OK!\n" );
	else if( ERROR == sat )
		printf( "error\n" );
	else
		printf( "%d\n", sat );
}
Status StrAssign( HString &T, char * chars )
{
	T.length = strlen( chars ) + 1; //easy one but it should plus one, because of the'\0' is one of it
	if( 0 == T.length )
	{
	T.ch = NULL;
	T.length = 0;
}
else
{
	if( !( T.ch = (char *)malloc(T.length * sizeof(char) ) ) )
		exit(0);
	for( int i = 0; i < T.length ; i++ )
		T.ch = chars;
}
	return OK;
}
Status StrLength( HString &T )
{
	return T.length - 1;
}
Status StrCompare( HString &T, HString S )
{
	for( int i = 0; i < S.length && i < T.length; i++ )
	{
		if( S.ch != T.ch )
		return S.ch - T.ch;
	}
	return S.length - T.length;
}
Status ClearString( HString &T )
{
	if( T.ch )
		free( T.ch );
	T.ch = NULL;
	T.length = 0;
	return OK;
}
Status Concat( HString &T, HString S1, HString S2 )
{
	if( T.ch )
		free( T.ch );
	if( !(T.ch = (char *)malloc( (S1.length + S2.length)*sizeof(char) ) ) )
		exit(0);
	for( int i = 0; i < S1.length - 1; i++ )
		T.ch = S1.ch;
	for( i = 0; i < S2.length; i++ )
		T.ch[S1.length - 1 + i] = S2.ch;
	T.length = S1.length + S2.length;
	return OK;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值