Chinaunix首页 | 论坛 | 博客
  • 博客访问: 793370
  • 博文数量: 133
  • 博客积分: 3477
  • 博客等级: 中校
  • 技术积分: 1369
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-30 21:53
文章分类

全部博文(133)

文章存档

2024年(4)

2023年(10)

2022年(4)

2021年(10)

2020年(9)

2018年(1)

2017年(1)

2014年(4)

2013年(3)

2012年(12)

2011年(24)

2010年(2)

2009年(8)

2008年(6)

2007年(34)

2006年(1)

分类: C/C++

2023-09-29 10:49:57

闲话不多说,直接贴代码,说结论;

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. int main ( void )
  5. {
  6.     char s[]="1,aaab,bb,cc,1200,0.00";
  7.     const char *delim=",";
  8.     char *token;
  9.  
  10.     token = strtok(s,delim);
  11.     while( token !- NULL )
  12.         token = (NULL,delim);
  13.     printf(" ====== strlen = %d =====\n",strlen((const char *)s);
  14.     return 0;
  15. }
我们编译了执行一下看看
$ cc -o a a.c
$ ./a 
====== strlen = 0 =====

What ? 出了什么问题?
上面的程序代码我们修改一下,将 printf 函数移到{BANNED}中国第一个 strtok 函数之前,看看是什么结果?

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. int main ( void )
  5. {
  6.     char s[]="1,aaab,bb,cc,1200,0.00";
  7.     const char *delim=",";
  8.     char *token;

  9.     printf(" ====== strlen = %d =====\n",strlen((const char *)s);
  10.  
  11.     token = strtok(s,delim);
  12.     while( token !- NULL )
  13.         token = (NULL,delim);
  14.     return 0;
  15. }
我们再次编译并执行一下看看
$ cc -o a a.c
$ ./a 
====== strlen = 22 =====


结论:
strtok 函数在进行字符串切割的时候,会对传入的字符串进行修改,每运行一次,就会将传入的字符串的分隔符之前的内容(包含分隔符)剪切掉,直到 token == NULL 的时候,这个时候传入的字符串其实已经被清零了。

今天的教训:
本来是想做一个字符串的字段个数检查的功能,结果发现这个字符串被清空了,导致后面的操作无法进行下去了。 ^_^.

阅读(106) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~