2009年3月12日 星期四

common Line and C++ 在Linux對空白的處理

今天在工作上碰到在common Line及程式與程式之間溝通的問題。
問了同事之後,其實是程式傳遞參數的問題。

先在一下幾個例子
common line:

ls a.txt
ls "a b.txt"
ls a b.txt"


a b.txt是個檔案,但a b中間有空白所以需要用上述的方式來表示。
c++:
先介紹一個好用的function。
int system( const char * command );        

這指令再我學C++時並沒有用過,而是等我接觸Linux並在上面寫code後才知道。
這function好用的原因是,Linux提供很多common可以用,有些事如果能用common完成就用common完成。
回歸正題,看一下C++的用法:
system("ls a.txt");
system("ls "a b.txt"");
system("ls a b.txt");

基本上可以看出與common的使用上不同地方。
個人覺得" 字串包含空白"(第二個範例)的使用放是最好用。
另外為什麼需要特別處理呢?
可以看一下
int main(int argc, char *argv[])
{
...
}

這看似簡單且大家常用,但常常會忽略了()內的參數。
argv是個矩陣負責接收執行是傳遞的參數。
如:
ls a.txt
在執行時argv會收到兩個字串
argv[0] = "ls"
argv[1] = "a.txt"
收取的方式以空白來區隔。所以發現了嗎?
當輸入ls a b.txt時,程式會收到,
argv[0] = "ls"
argv[1] = "a"
argv[1] = "b.txt"

這就是問題的中心了。