[C] strtok 使用心得
![[C] strtok 使用心得](http://whereiswelly.tw/wp-content/uploads/2013/04/1.jpg)
這傢伙實在有點酷,用一般的常理去推測是不行的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
}
822 Views