27 12月 2007

[C/C++] string使用strtok的問題

string ip1 = "140.113.100.1";
string ip2 = ip1;
strtok( (char*)ip1.c_str(), "." );
cout<<ip1<<endl;
cout<<ip1<<endl;

這樣子的結果,會讓ip1與ip2的內容變成一樣的!!! 為什麼呢? 這一切都是strtok的陰謀啦!!!

首先 先了解一下strtok的處理動作:
char * strtok( char * input, const char * delimiter);
每呼叫一次,便將input裡的第一個delimiter字元,改成'\0' (內碼為0)。因為strtok會將input的字串的內容值改掉,因為當input=="140.113.100.1",呼叫strtok一次後,會變成"140\0113.100.1",呼叫三次後,會變成"140\0113\0100\01"。

所以在呼叫strtok時,自以為小聰明的把原本strtok(ip1.c_str(),".");產生的error改掉。改成strtok((char*)ip1.c_str(),".");將ip1.c_str()的型別const char *強制轉換成char *,才會產生這種結果。產生error的時候,就是在提醒你,可能會有問題囉。


再來,明明ip1與ip2是不一樣的變數,怎麼改到ip1後,ip2也變了呢!?
這邊的話,就跟string的assignment function的機制有關係了,據我測試後的猜測,應該是當ip2=ip1;時,兩個的字串的指標是指到同一塊memory的(for 效率)。而當ip1或ip2其中任一個將字串裡的值改變後,string的assignment function才會再allocate另一塊memory給改變字串值的變數使用。

因此,上面的code的結果,才會讓ip1與ip2的印出的結果是一樣。
所以,結論就是,想要對c++的string切token的話,就不要用c的strtok()!!!

26 12月 2007

Netlimit IP Switcher前進SourceForge!

前一陣子跑去申請了一個SourceForge的帳號,Creatte了Netlimit IP Switcher的Project來玩玩,最近終於通過了,剛上去玩了一下,通通是英文…好難看得懂喔=_="""

SourceForge Netlimit IP Switcher

最近會把之前的Release跟Source code都放上去,有興趣的人再去那邊抓吧。

03 12月 2007

Ubuntu更改系統時間

最近在Ubuntu上,有時間不一致的問題,找了一些資料,找半天才找到,因此記錄一下。若要更改系統時間,指令如下(date+hwclock):
sudo date -s 2007/12/03
sudo date -s 17:02:07
sudo hwclock --systohc --utc


原本Linux上是用clock指令,而Ubuntu上是用hwclock指令。hwclock是將目前的時間,寫入HW中,才不會開機後時間又變回沒改之前的時間。

還有Ubuntu系統預設是用UTC的時間格式,若同一台電腦,同時安裝了Windows & Ubuntu可能會有時間上的問題,詳情請看此篇文章

另外一個方法
透過ntp,網路校正時間,會跟國家標準實驗室的 time server 校時,這個方法更方便,不用再自己看時間調date。
sudo ntpdate time.stdtime.gov.tw