2015-07-13 18 views
1

我怎樣才能在關於速度提高這個功能:該功能可以追加一個字符的字符串有效

void chrapp (char arr[], char chr, int pos) 
{ 
    memmove(arr + pos + 1, arr + pos, strlen(arr + pos)); 
    *(arr + pos + 1) = chr; 
} 

而且,遺憾的是不帶附加一個字符一開始工作的陣列,這也是一個改進之道。

+2

性能不談,這種不正常的部分原因是未能也動終止。 – WhozCraig

+3

試試'memmove(arr + pos + 1,arr + pos,strlen(arr + pos)+ 1);'所以你也複製null。 – Dmitri

+1

並且'*(arr + pos)= chr;',而不是'*(arr + pos + 1)= chr;' - 您需要寫入您打開的空間,而不是後面的字符。 – Dmitri

回答

1

使用@Dmitri評論,包括空終止'\0'在移動和*(arr + pos),而不是*(arr + pos + 1)

void chrapp(char arr[], char chr, int pos) { 
    memmove(arr + pos + 1, arr + pos, strlen(arr + pos) + 1); 
    *(arr + pos) = chr; 
} 

還有其他問題:

  1. 內存管理:現在,假定的空間存在。

  2. 檢測pos何時超過字符串的末尾。在這種情況下,只需追加。沒有這個測試,代碼結果將是災難性的。此時很容易將字符串大小添加到函數簽名並檢查它(未顯示)。

  3. 檢測pos何時位於字符串末尾。由於代碼知道字符串的長度,所以與#2一樣。以一種特殊的方式處理簡單的追加案例以加速功能是合理的,因爲它當然很常見。

  4. 使用更好的類型。 size_t,而不是intint而不是char - 通常速度更快或更快,而且它肯定比較習慣。

  5. 字符串函數經常返回字符串地址。

  6. char == '\0'應該有特殊處理。現有的代碼工作,除了不需要移位。一個移位,寫入一個不需要的額外空字符。

...

char *chrapp2(char arr[], int chr, size_t pos) { 
    size_t len = strlen(arr); 
    if (pos < len) { 
    // shift right 
    memmove(arr + pos + 1, arr + pos, len - pos + 1); 
    *(arr + pos) = chr; 
    } else { 
    arr[len] = chr; // Over-write \0 
    arr[len+1] = '\0'; 
    } 
    return arr; 
} 
+0

有沒有更好的方法(特別是更快)追加一個字符?這是最快的一個__我可以想出,但你似乎很瞭解追加,所以你可能會知道更好的解決方案。 – Malina

+0

如果代碼全部準備好就知道1)字符串的長度2)新索引不通過結束3)字符不是'\ 0' 4)空間可用,則最快是:'memmove(arr + pos + 1,arr + pos,len - pos + 1); *(arr + pos)= chr;'。 – chux

2

您的原始代碼正在經歷兩次字符串。一次用於計算字符串的長度,第二次用於移動字符串。你可以在一個循環中完成,但是考慮到標準庫函數是以高度優化的方式實現的,它不確定它實際上是否會加快速度。試試下面的代碼:

void chrapp (char arr[], char chr, int pos) { 
    char *s; 
    char cc; 
    for(s=arr+pos; *s; s++) { 
    cc = *s; *s = chr; chr = cc; 
    } 
    *s++ = chr; 
    *s = 0; 
} 
+0

有趣的方法。在一個循環中執行它聽起來像是對我的優化。 – Malina