|
发表于 2003-9-9 21:46:18
|
显示全部楼层
比较麻烦但是稳妥的办法: 四个接口,一个类型:
- typedef struct {
- char* buf;
- char* cur;
- size_t count;
- }CTX_word;
- int WordGetInit (CTX_word* ctx)
- {
- ctx->buf = 0L;
- ctx->count = 0;
- ctx->cur = 0L;
- return 0;
- }
- int WordBeginParse (CTX_word* ctx, char* buf)
- {
- char *p;
- ctx->buf = calloc ( sizeof (char), strlen (buf) );
- if ( !ctx->buf )
- return -1;
- memcpy ( ctx->buf, buf, strlen (buf) );
- ctx->count = strlen (buf);
- ctx->cur = ctx->buf;
- p = ctx->buf;
- while ( *p ) {
- if ( isspace (*p) )
- *p = '\0';
- p ++;
- }
- return 0;
- }
- char * GetNextWord (CTX_word* ctx)
- {
- char *p;
- while ( !(*(ctx->cur)) && (ctx->cur < (ctx->buf + ctx->count)) ) {
- ctx->cur ++;
- }
- p = ctx->cur;
- while ( *(ctx->cur) && ctx->cur < (ctx->buf + ctx->count)) ) {
- ctx->cur ++;
- }
- return (*p) ? p : 0L;
- }
- void WordGetClenup (CTX_word* ctx)
- {
- if ( ctx-> buf ) {
- free (ctx->buf);
- ctx->buf = 0L;
- }
- ctx->count = 0;
- ctx->cur = 0L;
- return;
- }
复制代码
使用的时候,现调用WordGetInit,然后设置WordGetParse, 通过GetNextWord 取得每个单词。最后使用WordGetCleanup 释放资源。 繁琐了一点,如果不追求效率的话,还是可以接受的,并且这样的好处就是避免了static带来的不可重入性。前几天写代码用strtok的时候一直出错,后来发现是因为我在调用strtok的时候,调用的别人的模块也调用了它,我faint. 上面的代码我没有验证过,呵呵,甚至没有编译,随手写的,希望对你有用。[/CODE] |
|