日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

蛋疼的strtok函数

發布時間:2025/3/15 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 蛋疼的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函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。