我怎樣才能在關於速度提高這個功能:該功能可以追加一個字符的字符串有效
void chrapp (char arr[], char chr, int pos)
{
memmove(arr + pos + 1, arr + pos, strlen(arr + pos));
*(arr + pos + 1) = chr;
}
而且,遺憾的是不帶附加一個字符一開始工作的陣列,這也是一個改進之道。
我怎樣才能在關於速度提高這個功能:該功能可以追加一個字符的字符串有效
void chrapp (char arr[], char chr, int pos)
{
memmove(arr + pos + 1, arr + pos, strlen(arr + pos));
*(arr + pos + 1) = chr;
}
而且,遺憾的是不帶附加一個字符一開始工作的陣列,這也是一個改進之道。
使用@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;
}
還有其他問題:
內存管理:現在,假定的空間存在。
檢測pos
何時超過字符串的末尾。在這種情況下,只需追加。沒有這個測試,代碼結果將是災難性的。此時很容易將字符串大小添加到函數簽名並檢查它(未顯示)。
檢測pos
何時位於字符串末尾。由於代碼知道字符串的長度,所以與#2一樣。以一種特殊的方式處理簡單的追加案例以加速功能是合理的,因爲它當然很常見。
使用更好的類型。 size_t
,而不是int
。 int
而不是char
- 通常速度更快或更快,而且它肯定比較習慣。
字符串函數經常返回字符串地址。
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;
}
您的原始代碼正在經歷兩次字符串。一次用於計算字符串的長度,第二次用於移動字符串。你可以在一個循環中完成,但是考慮到標準庫函數是以高度優化的方式實現的,它不確定它實際上是否會加快速度。試試下面的代碼:
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;
}
有趣的方法。在一個循環中執行它聽起來像是對我的優化。 – Malina
性能不談,這種不正常的部分原因是未能也動終止。 – WhozCraig
試試'memmove(arr + pos + 1,arr + pos,strlen(arr + pos)+ 1);'所以你也複製null。 – Dmitri
並且'*(arr + pos)= chr;',而不是'*(arr + pos + 1)= chr;' - 您需要寫入您打開的空間,而不是後面的字符。 – Dmitri