| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1022 人关注过本帖
标题:结构体原来还可以这么用 -- 结构体的高级应用 -- 原创安全字符串
只看楼主 加入收藏
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
 问题点数:0 回复次数:3 
结构体原来还可以这么用 -- 结构体的高级应用 -- 原创安全字符串

最近研究发现,结构体还可以如同C++类一样构造使用,一时心血来潮写了个安全字符串结构,大家来看看,也请各位高手指点不足,谢谢啦。。 /* string.h */ #ifndef __STRING_H #define __STRING_H

#include "string.cpp"

#endif /* string.cpp */ typedef enum {FALSE=0,TRUE=1} BOOL;

typedef struct safe_string { /* variable */ char *contents; int buffer_size; /* construction */ void initalize(void); /* member function */ void buf_allocate(int); void buf_reallocate(int); void buf_release(void); BOOL autostring(const char *); BOOL getstring(const char *); int getlength(void); /* destory */ void destory(void); } string;

void safe_string::initalize(void) { contents=NULL; buffer_size=0; }

void safe_string::buf_allocate(int bufsize) { destory(); contents=(char *)malloc(bufsize); if(!contents) { printf("No memory for allocating a new string!\n"); printf("Press any key to exit.\n"); getch(); exit(1); } buffer_size=bufsize; }

void safe_string::buf_reallocate(int bufsize) { if(!contents) contents=(char *)malloc(bufsize); else contents=(char *)realloc(contents,bufsize); if(!contents) { printf("No memory for reallocating a new string!\n"); printf("Press any key to exit.\n"); getch(); exit(1); } buffer_size=bufsize; }

void safe_string::buf_release(void) { int len=getlength(); contents=(char *)realloc(contents,len+1); if(!contents) { printf("No memory for reallocating a string!\n"); printf("Press any key to exit.\n"); getch(); exit(1); } buffer_size=len+1; }

BOOL safe_string::autostring(const char *s) { if(!s) return FALSE; int len=strlen(s); buf_allocate(len+1); strcpy(contents,s); return TRUE; }

BOOL safe_string::getstring(const char *s) { if(!s) return FALSE; if(!contents) return FALSE; int len=strlen(s); if(len+1>buffer_size) return FALSE; else { strcpy(contents,s); return TRUE; } }

int safe_string::getlength(void) { char *p=contents; int len=0; while(*p++) len++; return len; }

void safe_string::destory(void) { if(contents) free(contents); } /* debug_string.cpp */ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <conio.h>

#include "string.h"

int main() { string s; s.initalize(); s.autostring("Hello,world"); printf("%s,%d,%d\n",s.contents,s.buffer_size,s.getlength()); s.destory(); getch(); }

搜索更多相关主题的帖子: 结构体 字符 高级 应用 
2005-07-11 13:24
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 
C++中的 结构体是一个特殊的类,这个与C中的 结构体不能混淆。

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2005-07-11 16:30
天使预备役
Rank: 2
等 级:论坛游民
威 望:3
帖 子:670
专家分:10
注 册:2004-4-6
收藏
得分:0 
在C编辑器下可以这样写么?
能运行过去?我的TC2。0不行!
如果不能在C编辑器下运行那就不是你说的什么秘密了,而是象KNOCKER所说的在C++中
结构就是特殊的类,唯一的区别就是,在结构中的成员默认是公有的,而类是私有的!你看看,联合也是可以的!

差点把你忘了...
2005-07-11 16:51
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
得分:0 
好像TC2无法运行,先前一直使用Dev-C++编译的,没有注意到这一点,经大家的点拨,我明白了许多,谢谢。。

我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2005-07-11 17:21
快速回复:结构体原来还可以这么用 -- 结构体的高级应用 -- 原创安全字符串
数据加载中...
 
   



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

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