根据对书上伪代码的理解,编写了这么一段堆分配储存的程序,反正运行着没有什么问题,看看网上其他人的代码,具体细节上有所不同外,思路上都差不多。保存一下,万一有高手过来,还能给指点一下。
# include
# include
# include
# include
//设置结构体变量
typedef struct string
{
char * ch;
int length;
}STRING,* PSTRING;
//函数前置声明
//初始化结构体
void InitString( PSTRING );
//串的赋值操作
void StrAssign( PSTRING, char * );
//串的长度
int StrLength( PSTRING );
//比较两个串的大小
int StrCompare( PSTRING, PSTRING );
//清空一个串
bool ClearString( PSTRING );
//拼接两个串,组成一个新串
bool Concat( PSTRING, PSTRING, PSTRING );
//在某个位置上截取某个长度
bool SubString( PSTRING, PSTRING, int, int );
/*
初始化
*/
void InitString(PSTRING str)
{
str -> ch = NULL;
str -> length = 0;
}
/*
串的赋值操作
@paramPSTRINGstr将目标串赋值到该串
@paramchar *s 被复制的串
returnvoid
*/
void StrAssign(PSTRING str,char * s)
{
int i, j;
//判断指针是否为空,如果不为空,将内存再用释放
if( str -> ch )
{
free( str -> ch );
str -> ch = NULL;
}
//判断传入字符串的长度
for( i = 0; s[i] != '\0'; i++ );
//在内存中动态分配出空间
str -> ch = ( char * )malloc( i * sizeof( char ) );
if( NULL == str -> ch )
{
printf("动态内存分配失败\n");
return;
}
//逐个将值复制过来
for( j = 0; j
{
str -> ch[j] = s[j];
}
//给长度赋值
str -> length = i;
return; //结束
}
//返回串的长度
int StrLength( PSTRING str )
{
return str -> length;
}
/*
比较两个串的大小
@paramPSTRINGstr1 其中一个串
@paramPSTRINGstr2 其中一个串
returnint
思路:
1,逐个比较元素的ascii码,返回正数或者负数
2,如果比较完毕,在比较两个串的长度,返回0 或者 非0
*/
int StrCompare( PSTRING str1, PSTRING str2 )
{
int i;
for( i = 0; i length && i length; ++i )
{
if( str1->ch[i] != str2->ch[i] )
{
return str1->ch[i] - str2->ch[i];
}
}
return str1->length - str2->length;
}
//清空一个串
bool ClearString( PSTRING str )
{
free( str -> ch );
str -> ch = NULL;
str -> length = 0;
return true;
}
//拼接两个串,组成一个新串
bool Concat( PSTRING str3, PSTRING str1, PSTRING str2 )
{
int i, total;
//释放上一次使用的空间
if( str3 -> ch )
{
/*
free( str3 -> ch );
这里需要注意一下,之前这里老报错,检查之后才知道,
忘了为str3初始化。不初始化的结果就是:str3 -> ch中
保存的是一个垃圾值,然后到了下行要释放空间的时候,因为
保存的是一个垃圾值,或者是一个野指针,所以,程序出错,
初始化一下str3,就好了。
PS:对初始化的认知更深刻了。
*/
free( str3 -> ch );
str3 -> ch = NULL;
str3 -> length = 0;
}
//如果要拼接的两个串是空串,返回false
if( str1 -> length == 0 && str2 -> length == 0 )
{
return false;
}
//计算出两个串的总长度
total = str1->length + str2->length;
//为str3动态分配内存空间
str3 -> ch = ( char * )malloc( total * sizeof( char ) );
if( NULL == str3 -> ch )
{
printf( "动态内存分配失败\n" );
return false;
}
//将str1的内容复制到str3
for( i = 0; i length; ++i )
{
str3 -> ch[i] = str1 -> ch[i];
}
//将str2的内容复制到str3
for( i = 0; i length; ++i )
{
str3 -> ch[str1->length + i] = str2 -> ch[i];
}
//把总长度赋值给str3
str3 -> length = total;
return true;
}
/*
截取字符串
@paramPSTRINGstr截取之后的新子串
@paramPSTRING str1 将要截取的串
@paramintpos 要截取的位置
@paramintlen 要截取的长度
return boolean
*/
bool SubString( PSTRING str, PSTRING str1, int pos, int len )
{
int i;
/*
首先对传入参数进行验证
pos 的取值范围 1 <= pos <= str1->length
len 的取值范围 0 length - pos + 1
*/
if( pos str1->length && len <= 0 && len > str1->length - pos + 1 )
{
return false;
}
//释放上一次使用的空间
if( str -> ch )
{
free( str -> ch );
str -> ch = NULL;
str -> length = 0;
}
//分配空间
str -> ch = ( char * )malloc( len * sizeof(char) );
if( NULL == str -> ch )
{
printf("动态内存分配失败\n");
return false;
}
//赋值操作
for( i = 0; i
{
str -> ch[i] = str1 -> ch[pos - 1 + i];
}
str -> length = len;
return true;
}
//主函数
int main( void )
{
int i;
STRING str1, str2, str3, str4;
InitString( &str1 );
InitString( &str2 );
InitString( &str3 );
InitString( &str4 );
printf( "将“abcde”赋值给str1\n" );
printf( "将“fghijklmn”赋值给str2\n" );
StrAssign( &str1, "abcde" );
StrAssign( &str2, "fghijklmn" );
i = StrCompare( &str1, &str2 );
printf( "比较str1和str2的结果:%d\n", i );
printf( "拼接str1和str2,并且赋值给str3:\n" );
Concat( &str3, &str1, &str2 );
for( i = 0; i
{
printf( "%c ", str3.ch[i] );
}
printf( "\n" );
printf( "从str3的第5个元素截取5个值,赋予str4:\n" );
SubString( &str4, &str3, 5, 5 );
for( i = 0; i
{
printf( "%c ", str4.ch[i] );
}
printf( "\n" );
printf( "清空str3串:\n" );
if( ClearString( &str3 ) )
{
printf( "str3已经被清空\n" );
}
return 0;
}
/*
在VC++6.0中输出的结果是:
===========================
将“abcde”复制给str1
将“fghijklmn”复制给str2
比较str1和str2的结果:-5
拼接str1和str2,并且赋值给str3:
a b c d e f g h i j k l m n
从str3的第5个元素截取5个值,赋予str4:
e f g h i
清空str3串:
str3已经被清空
===========================
*/
就这么着吧,有时间再把块链的代码实现一下,书上也真够简单的,伪代码也给省略了……