免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: jazy
打印 上一主题 下一主题

[函数] 关于使用strtok函数在一次循环中同时从多个串中取出字段的问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2003-02-28 17:48 |只看该作者

关于使用strtok函数在一次循环中同时从多个串中取出字段的问题

除了null方式调用,还可以使用别的方式吗?不好意思, 这个函数还是第一次使用!能否多指点指点!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
12 [报告]
发表于 2003-02-28 17:56 |只看该作者

关于使用strtok函数在一次循环中同时从多个串中取出字段的问题

你是说strtok么?应该就这两种方式。

如果是说strtok_r,我就先试试看吧

论坛徽章:
0
13 [报告]
发表于 2003-02-28 17:59 |只看该作者

关于使用strtok函数在一次循环中同时从多个串中取出字段的问题

这个函数没有其他方式了,
   再说一次,如果你使用这个函数,不能使用循环调用。
   这个函数他在系统里是使用静态变量来定位的。
   内存没有释放前,他是不断向后走的,只到空字符。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
14 [报告]
发表于 2003-02-28 18:02 |只看该作者

关于使用strtok函数在一次循环中同时从多个串中取出字段的问题

char *save_FullTime = strdup(FullTime);

token_time = strtok_r(FullTime, delim, &save_FullTime);
....
token_time = strtok_r(NULL, delim, &save_FullTime);

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
15 [报告]
发表于 2003-02-28 18:46 |只看该作者

关于使用strtok函数在一次循环中同时从多个串中取出字段的问题

代码我改了一下,你看看.
另外,第三个参数不用分配内存

  1. #include <stdio.h>;
  2. #include <string.h>;
  3. #include <strings.h>;


  4. int main() {

  5.         const char * seps_time   = "|";
  6.         const char * seps_money  = "|";
  7.         const char * seps_card   = "|";
  8.         const char * seps_result = "|";

  9.         char *token_time;
  10.         char *token_money;
  11.         char *token_card;
  12.         char *token_result;

  13.         char * v_FullTime = strdup("|1|2|3 |4 |5 |6|7");
  14.         char * v_FullMoney = strdup("|200.00|500.00|50.00 |1.00 |1.00 |100.00|1.00");
  15.         char * v_OutCardnumber = strdup("|020330235786|020539839303|201137003938|201632434262|201686070898|757269357692|757623964302
  16. ");
  17.         char * v_Result = strdup("|0|0|0|0|0|0|0");

  18.         char * save_time;
  19.         char * save_money;
  20.         char * save_card;
  21.         char * save_result;

  22.         token_time   = strtok_r(v_FullTime, seps_time, &save_time);
  23.         token_money  = strtok_r(v_FullMoney, seps_money, &save_money);
  24.         token_card   = strtok_r(v_OutCardnumber, seps_card, &save_card );
  25.         token_result = strtok_r(v_Result, seps_result, &save_result);

  26.         while( token_time != NULL &&token_money != NULL && token_card != NULL &&token_result != NULL)
  27.    {

  28.       printf(" time :%s money :%s card :%s result :%s\n", token_time,token_money ,token_card,token_result);
  29.       /* Get next token: */
  30.         token_time   = strtok_r(NULL, seps_time, &save_time);
  31.         token_money  = strtok_r(NULL, seps_money, &save_money);
  32.         token_card   = strtok_r(NULL, seps_card, &save_card );
  33.         token_result = strtok_r(NULL, seps_result, &save_result);
  34.    }

  35. }

复制代码

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
16 [报告]
发表于 2003-02-28 18:51 |只看该作者

关于使用strtok函数在一次循环中同时从多个串中取出字段的问题

有3个需要注意的地方:

1.参数1不能是const string,否则会core dump
2.参数1最好是动态copy后的串,因为这两个调用会修改它的内容。
3.最后一个参数是用来保存位置的,所以不用分配空间。每次填入就好了

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
17 [报告]
发表于 2003-02-28 18:54 |只看该作者

关于使用strtok函数在一次循环中同时从多个串中取出字段的问题

呵呵,不明白你的意思,我这个已经能正常打印各个字段了,你试试看.我在HP和linux上都测试过了,没问题

论坛徽章:
0
18 [报告]
发表于 2003-02-28 19:30 |只看该作者

关于使用strtok函数在一次循环中同时从多个串中取出字段的问题

不好意思!

我发那个贴时,没看到你的贴,我刚才编译了你的代码,但还没通过!
我正在找哪有问题!

论坛徽章:
0
19 [报告]
发表于 2003-02-28 19:48 |只看该作者

关于使用strtok函数在一次循环中同时从多个串中取出字段的问题

非常感谢gadfly!编译通过了,虽然有警告信息!

结果也正确!我收回刚才的不理智及过早的结论!

但是,我还是有点疑惑,这两段代码的关键不同之处就在于strtok和strtok_r两个函数的实现上!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
20 [报告]
发表于 2003-02-28 22:47 |只看该作者

关于使用strtok函数在一次循环中同时从多个串中取出字段的问题

呵呵,不客气了。其实我也没有实际用过strtok_r,有你的实际问题,我才能了解用法。

其实这类函数的区别都是一样的。我举个几个例子:
gethostbyname和gethostbyname_r
asctime和asctime_r
gmttime和gmttime_r
以及solaris上大量的mt safe routine.

前者不可重入,后者可重入。

是由于前者的实现用到了静态的或全局变量保存状态或返回结果,所以不可重入。
而后者用传入的变量保存状态或者返回值,所以不会有这问题。

上面的strtok就是用全局或者静态变量保存了本次查询的源串(状态)。所以用
strtok(NULL, ..)查询的源串一定是最后一次的非NULL源串。

像gmttime就是用全局或静态变量保存结果。所以如果你如果这样用的话
struct tm * begin = gmttime(..);
.....
struct tm * end = gmttime(...);

process(begin, end);

就会有问题。因为begin和end指向的是同一个地址。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP