[C] strtok 使用心得
這傢伙實在有點酷,用一般的常理去推測是不行的XD
當然有可能是我太憨,但是這個好用的東西是該學習一下他的正確使用規則!
以下Code為比較兩個組數的大小,所以我必須要先把每段分開來判斷大小。
這時候就必須用到strtok來切割這個組數。
切割完以後再將其轉為flaot type比大小。
錯誤的想法:
我一開始最直觀的想法就是一邊切一邊比較大小,
也就是類似以下概念:
int main(void){ float outputvalue=0; char input[30] = "1.32.12"; char input2[30] = "1.99.13"; outputvalue = VersionCompare(input,input2); printf("the value = %.2f\n",outputvalue); } int VersionCompare(char *current_ver, char *net_ver){ int result = 0; char *current, *net; //開始切割字串1 current = strtok (current_ver,"."); //---------------------切第一個字串 net = strtok (net_ver,"."); //---------------------切第二個字串 /*... 然後在此比較current和net最左邊一個擷取結果的大小 */ current = strtok (NULL,"."); net = strtok (NULL,"."); /*... 然後在此比較current和net左邊數來第二個擷取結果的大小 */ current3 = strtok (NULL,"."); net3 = strtok (NULL,"."); /*... 然後在此比較current和net的最後一個擷取結果大小 */ return 0; }
結果以上的那個方式完全不行,會跳出segmentation fault!!!
後來發現原來他從第13行以後,擷取的東西通通都變成net_ver擷取的結果,所以net_ver根本沒那麼長,
但是我們又去呼叫strtok他就發現他切到空的東西就segmentation fault。
也因此發現strtok好像一列火車,你開了以後就除非到站(字串結束)他才收工。
所以你中途給他換了切割的目標字串,他就變成只切你換過去的那個字串,先前切到一半的那個就不見了XD
看來要切一個字串就必須要整個切完才能切下一個!!
下面才是正確的寫法。
#include <stdio.h> //include for printf function #include <string.h> //include for strtok int VersionCompare(char *, char *); int main(void){ float outputvalue=0; char input[30] = "1.321.12"; char input2[30] = "1.199.13"; outputvalue = VersionCompare(input,input2); printf("the value = %.2f\n",outputvalue); } int VersionCompare(char *current_ver, char *net_ver){ //char *version_tmp = malloc(20); //strcpy(version_tmp,Str); int result = 0; char *current1, *net1, *current2, *net2, *current3, *net3; //開始切割字串1 current1 = strtok (current_ver,"."); current2 = strtok (NULL,"."); current3 = strtok (NULL,"."); printf("current1 = %0.1f, current2 = %0.1f, current3 = %0.1f\n",atof(current1),atof(current2),atof(current3)); //開始切割字串2 net1 = strtok (net_ver,"."); net2 = strtok (NULL,"."); net3 = strtok (NULL,"."); printf("net1 = %0.1f, net2 = %0.1f, net3 = %0.1f\n",atof(net1),atof(net2),atof(net3)); if(atof(current1)>atof(net1)){ result = 1; printf("cur1>net1\n"); } else if(atof(current2)>atof(net2)){ result = 1; printf("cur2>net2\n"); } else if(atof(current3)>atof(net3)){ result = 1; printf("cur3>net3\n"); } return result; //if net_ver > current_ver }
430 Views