//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;
}堆分配表示串
最新推荐文章于 2022-05-27 17:55:46 发布
1318

被折叠的 条评论
为什么被折叠?



