[C] strtok 使用心得

[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


發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *