|
发表于 2003-10-18 02:48:24
|
显示全部楼层
嗯,想的可能有点多了,其实对第三种方法没有必要搞这么麻烦,把wordbuf直接返回linebuf + begin就可以了,这个函数并没有一定要得到第n个词的拷贝,我们返回第n个词在linebuf中的位置就可以了,反而更实用,如果需要这个词的拷贝的话,反正有返回的长度,可以用strncpy做一个拷贝。
如果函数返回一个分配的wordbuf,那么这个函数就只能有一个用途,就是得到第n个词是什么,wordbuf返回linebuf + begin并配合以函数返回词的长度也可以做到这一点,并且还可以有很多用法,比如改写linebuf之类的,我觉得这样更好。
大概改了一下:
- int
- getnword(char *linebuf,char **wordbuf,char *delims, int n)
- {
- int len, begin, end = 0;
- int num = 0;
- if(!linebuf || !delims || n < 1)
- return(0);
- len = strlen(linebuf);
- begin = strspn(linebuf, delims);
- end = begin + strcspn(linebuf + begin, delims);
- while(begin < end && begin < len){
- if(++num == n){
- if(wordbuf)
- *wordbuf = linebuf + begin;
- return(end - begin);
- }
- begin = end + strspn(linebuf + end, delims);
- end = begin + strcspn(linebuf + begin, delims);
- }
- return(0);
- }
复制代码
第二个参数改成了char **,是为了返回位置,函数返回0表示没找到,当然也可以把第一个return(0)改成return(-1),表示错误。
用的时候可以
- char *wordbuf; /* linebuf, delims, n 已定义 */
- char buf[80];
- int len;
- if(len = getnword(linebuf, &wordbuf, delims, n)){
- strncpy(buf, wordbuf, len);
- buf[len] = '\0';
- printf("found "%s"\n", buf);
- }else
- printf("not found\n");
复制代码
当然,这里也可以用len + 1先给buf分配空间, |
|