2010-02-16 89 views
0

這裏是我的問題:我有一個數組,其中包含的命令的[1],其次是幾個命令的ARG A [2],[3],...高效的字符串連接

我需要做的是以下

  • 創建一個字符串,由CMD和args的組合 如:

CMD ARG1參數3

  • 執行該命令串

下面是如何woud做到這一點(僞代碼):每個arg的

  1. 預先計算的長度,並將其存儲在一個陣列
  2. 獲取組合(使用GNU科學庫)
  3. 計算分配字符串所需的字節大小(長度cmd + 1 + lengthof ARG1 + 1 + ARGN-1 + 1)(在1通常爲爲空白,並在 末端爲\ 0)
  4. 通過使用strcat的
  5. 執行命令串
構建串

嗯,它的工作原理,但我不知道是否故意使用strcat實際上是有效的/正確的方式來做到這一點。

有什麼建議嗎?

+2

我不會不確定什麼是'組合'的確切..?爲什麼不使用execve之類的東西? – lorenzog 2010-02-16 11:27:26

+0

沒有想到......這可能是更好的解決方案 – helpermethod 2010-02-16 12:45:52

回答

5

不,使用strcat()效率不高,因爲每次調用它時都必須遍歷字符串以查找結尾。

如果你有它(並且可以擠壓你的參數),或者使用直接指針操作自己做,可以使用snprintf()一次全部做好。

當然,在實踐中這很重要,你需要經常運行這個命令。

+0

對於'snprintf'的+1。 'snprintf'的一個很好的特性是你可以傳遞一個零長度(甚至可能是一個NULL緩衝區地址),它會返回你需要的字節數。一個常用的技術是調用長度爲0的'snprintf()',使用返回值給'malloc()'所需的空間,然後再次使用緩衝區調用'snprintf()'。 – tomlogic 2010-02-16 17:00:25

2

如果您存儲了每個組件字符串的長度,您可以使用memcpy使用正確的指針偏移量而不是使用strcat來切換到不使用該字符串的末尾, '\0',但除此之外,沒有更多的事情可以做,使連接的創建速度顯着加快。

1

strcat()以及標準庫中的所有字符串操作函數效率低下。這是由於字符串存儲在C中的方式,即零終止,因此每個函數都必須遍歷每個字符來查找字符串的結尾。

無論如何,你正在做一個過早的優化:與命令執行相比,這裏的多個strcat()調用將執行得非常快,所以你不應該擔心連接方式的效率。

在優化部分代碼之前,您必須證明它是一個瓶頸,並且優化將真正提高執行時間。在大多數情況下,沒有必要進行優化:根本不值得花費時間。