簡體   English   中英

C中的高效字符串連接

[英]Efficient string concatenation in C

這是我的問題:我有一個數組,其中包含命令a [1],后跟幾個命令args a [2],a [3],...

我需要做的是以下幾點

  • 創建一個字符串,該字符串由cmd和args的組合組成,例如:

cmd arg1 arg2 arg3

  • 執行該命令字符串

這是我要怎么做(偽代碼):

  1. 預計算每個arg的長度並將其存儲在數組中
  2. 獲取組合(使用GNU科學庫)
  3. 計算分配字符串所需的大小(以字節為單位)(cmd的長度+ 1 + arg1的長度+ 1 + argn-1的長度)(對於空格,+1表示,\\ 0末尾表示+1)
  4. 通過使用strcat構建字符串
  5. 執行命令字符串

好吧,它起作用了,但是我想知道是否故意使用strcat實際上是有效的/正確的方法。

有什么建議么?

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

如果有的話,最好一次使用snprintf()所有操作(並且可以在其中擠壓參數),或者直接使用指針操作自己做。

當然,要使這在實踐中起作用,您確實確實需要經常運行此命令。

如果您已經存儲了每個組件字符串的長度,則可以切換到使用具有正確指針偏移量的memcpy而不是使用strcat ,因為strcat不必查找字符串的末尾並測試每個源字符是否針對'\\0' ,但是除此之外,您還可以做很多事情,以使創建串聯的速度更快。

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

無論如何,您正在做一個過早的優化:與命令執行相比,這里的多個strcat()調用執行起來確實非常快,因此您不必擔心連接方式的效率。

在優化代碼的一部分之前,您必須證明這是一個瓶頸,並且優化確實會縮短執行時間。 在大多數情況下,無需進行優化:根本不值得花費時間。

我會用sprintf做到的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM