蛋疼的strtok函数

解一道题的时候要用到字符串分割,但是c标准库里没有类似java,python中的split()函数啊,自己写的话要用到strtok()这个函数,这可真是个让人蛋疼的函数。下面说为什么。

给出我的原始代码

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 
 5 int  split(char **arr,char *str,const char *del)
 6 {
 7     int count =0;
 8     char *s  = strtok(str,del);
 9     while (s)
10     {
11         *arr++ = s;
12         s = strtok(NULL,del);
13         count++;
14 
15     }
16     return count;
17 }
18 int main()
19 {
20     //printf("Hello world!\n");
21     char *str = "wo shi lian wen long";
22     char *save[10] ;//= {};
23     memset(save,0,sizeof(save));
24    char buff[20];
strcpy(buff,str);
25 const char *del = " "; 26 int i = split(save,buff,del); 27 int j; 28 29 for (j=0;j<i;j++) 30 { 31 printf("%s\n",save[j]); 32 } 33 34 return 0; 35 }

gcc编译器显示我在调用strtok()的时候出现段错误。

百思不得骑姐,最终在stackoverflow上找到了答案。

http://stackoverflow.com/questions/8957829/strtok-segmentation-fault

原来是因为我在调用strtok的时候会改变字符串的字面值,但这是不被允许的。因为"wo shi lian wen long"是常量字符串,被存储在只读空间中,str是个可以读写的指针,用非常量字符指针指向常量字符串本身在逻辑上就是错误的,对常量字符串进行读写操作(即应用于strtok())造成了实际错误。我的代码中给出了改正的方法,strcpy(buff,str),因为buff是个数组,str指向的常量字符串存储在数组中,而数组是在数据区储存,所以可以对数组内的数据进行读写。按照同样的思路,char buff[] = str;也可以改正错误。

想要改写指针指向的空间,就要保证指针指向的是可写的空间,强行改写只读空间是不鼓励的。

posted @ 2013-07-22 13:34  lianw  阅读(429)  评论(0编辑  收藏  举报