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中包含的字符都会被滤掉,并将被滤掉的地方设为一处分割的节点。
问题:在使用的过程中经常会出来一些错误,像段错误,内存释放两次等错误。如下代码
- #include<stdio.h>
- #include<malloc.h>
- #include<string.h>
- int main(void)
- {
- char input[16] = "abc,d";
- char *p=NULL;
-
- p = malloc(16*sizeof(char));
- if(p == NULL){
- puts("malloc error\n");
- return 1;
- }
- p = strtok(input,",");
- if(p)
- printf("%s\n",p);
- p= strtok(NULL,",");
- if(p)
- printf("%s\n",p);
- free(p);
- p = NULL;
- return 0;
- }
仔细检查发现没什么语法错误,编译执行出来如下图片错误
解决方法:在使用的过程中即使有if条件限制,也总是会出来段错误,利用一个flag变量,先判断字符串中是否有分隔符delim,之后再做处理,就ok了。(如下代码)
- else if (strncmp(DNS, key, strlen(DNS)) == 0) {
- while(value[i++] != '\0')
- {
- if(value[i] == ',')
- {
- flag = 1;
- break;
- }
- }
- if(flag == 0){
- strcpy(nGblInfo->dns, value);
- strcpy(nGblInfo->sdns, "");
- }
- else if(flag == 1){
- memset(nGblInfo->sdns, 0, sizeof(nGblInfo->sdns));
- strcpy(nGblInfo->dns,strtok(value,","));
- strcpy(nGblInfo->sdns, strtok(NULL,","));
- }
- break;
- }
经过多次使用strtok函数,得出的结论是这个函数内部实现不好,尽量少用,或者是用的时候最好用一个flag标量来判断。
阅读(1535) | 评论(0) | 转发(0) |