Chinaunix首页 | 论坛 | 博客
  • 博客访问: 317803
  • 博文数量: 50
  • 博客积分: 494
  • 博客等级: 下士
  • 技术积分: 1045
  • 用 户 组: 普通用户
  • 注册时间: 2012-11-06 16:49
文章分类

全部博文(50)

文章存档

2016年(1)

2014年(4)

2013年(29)

2012年(16)

分类: C/C++

2012-11-14 11:37:54

c语言 strtok函数 原型  char *strtok(char *s, const char *delim);功能  分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。说明  strtok()用来将字符串分割成一个个片段。参数s指向欲分割的字符串,参数delim则为分割字符串,当strtok()在参数s的字符串中发现到参数delim的分割字符时则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回被分割出片段的指针。返回值  从s开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。   所有delim中包含的字符都会被滤掉,并将被滤掉的地方设为一处分割的节点。

问题:在使用的过程中经常会出来一些错误,像段错误,内存释放两次等错误。如下代码

点击(此处)折叠或打开

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

  4. int main(void)
  5. {
  6.     char input[16] = "abc,d";
  7.     char *p=NULL;
  8.     
  9.     p = malloc(16*sizeof(char));
  10.     if(p == NULL){
  11.         puts("malloc error\n");
  12.         return 1;
  13.     }

  14.     p = strtok(input,",");
  15.     if(p)
  16.         printf("%s\n",p);

  17.     p= strtok(NULL,",");

  18.     if(p)
  19.         printf("%s\n",p);

  20.     free(p);
  21.     p = NULL;
  22.     return 0;
  23. }
仔细检查发现没什么语法错误,编译执行出来如下图片错误


解决方法:在使用的过程中即使有if条件限制,也总是会出来段错误,利用一个flag变量,先判断字符串中是否有分隔符delim,之后再做处理,就ok了。(如下代码)

点击(此处)折叠或打开

  1. else if (strncmp(DNS, key, strlen(DNS)) == 0) {
  2. while(value[i++] != '\0')
  3. {
  4.     if(value[i] == ',')
  5.     {
  6.         flag = 1;
  7.         break;
  8.     }
  9. }

  10. if(flag == 0){
  11.     strcpy(nGblInfo->dns, value);
  12.     strcpy(nGblInfo->sdns, "");
  13. }
  14. else if(flag == 1){
  15.     memset(nGblInfo->sdns, 0, sizeof(nGblInfo->sdns));
  16.     strcpy(nGblInfo->dns,strtok(value,","));
  17.     strcpy(nGblInfo->sdns, strtok(NULL,","));
  18. }

  19. break;
  20. }

经过多次使用strtok函数,得出的结论是这个函数内部实现不好,尽量少用,或者是用的时候最好用一个flag标量来判断。



阅读(1535) | 评论(0) | 转发(0) |
0

上一篇:c语言 数组

下一篇:访问smb共享失败

给主人留下些什么吧!~~