蛋疼的strtok函数
生活随笔
收集整理的這篇文章主要介紹了
蛋疼的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;也可以改正錯誤。
想要改寫指針指向的空間,就要保證指針指向的是可寫的空間,強行改寫只讀空間是不鼓勵的。
轉載于:https://www.cnblogs.com/lianwl/p/3205159.html
總結
以上是生活随笔為你收集整理的蛋疼的strtok函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OSX系统编译cocos2dx andr
- 下一篇: BZOJ2100