2010-05-21 59 views
1
// The first example: 
char text[] = "henri"; 
char *p; 
p = text; 
*(p + 1) = 'E'; // Output = hEnri 
// Now If we want to remove the "e" ie hnri, we would go for????? 
    *(p + 1)=????? 

顯而易見的答案是將數組的其餘部分複製一個位置。但是這似乎......不愉快。當然有更好的辦法嗎?有沒有一種很好的方法可以從字符串中刪除一個字符而不需要複製它後面的所有字符?

+7

使用錘子! – Codism 2010-05-21 18:20:55

+3

我不認爲這是可能的一個單一的分配操作。 – FrustratedWithFormsDesigner 2010-05-21 18:21:33

+1

@Codism更好地使用你的頭:-) – 2010-05-21 18:21:49

回答

4

複製最好的解決方案,真正當你去除數組中元素的唯一解決方案。 (你可以在數組的末尾特殊指定元素,但就是這樣)。我不明白爲什麼這麼糟糕。

你需要做兩件事之一。兩者都涉及一些複製。 1)將'n'複製到'E'所在的位置,'r'複製到'n'所在的位置,'i'複製到'r'所在的位置,然後null終止它。 2)將'h'複製到'E'所在的位置,然後始終使用指向'h'新位置的指針。這可能並不總是一種選擇。

+0

如果字符串非常長且分配在堆上,您可能還需要複製指針並保存一些循環。移動指針更有效率(例如鏈接列表) – 2010-05-30 00:15:21

1

你必須將所有剩餘的字符移動一個。沒有辦法說「跳過這個字符」。

while (*p) 
{ 
    *p = *p++; 
} 

編輯:呃,我是怎麼犯這個錯誤的?現在修復。 p在字符串的末尾仍然是非空的,但* p不會。

+1

這裏有兩個錯誤:1. while(p)'將繼續循環,直到p爲NULL,你想'while(* p)'2。即使這樣,你需要複製結尾''\ 0'' – 2010-05-21 18:24:10

+0

@BlueRaja:* p是一個完整的腦衰,謝謝。但是你不需要複製終止0,這將在循環的最後一次迭代中完成。 – Vicky 2010-05-21 18:26:35

+0

不* p = * p ++不會導致未定義的行爲,因爲您修改了'p'並且讀取了它(不僅僅是爲了確定要存儲的值)而沒有介入序列點?此外,我看不到一種方式來排序會做正確的修改(它絕對不能用'gcc')。如果您將其更改爲'* p = *(p + 1); ++ p;'它確實有效。 – 2010-05-21 19:58:18

3
*++p = 'h'; 
puts(p); 
+1

因爲我很確定這不是面試官尋找的過於聰明的答案。 -shrug- – 2010-05-21 18:30:46

+0

@Neil:因爲如果我們嘗試打印'text',那將無法工作:) – 2010-05-21 18:45:12

0

向下移動的字符由1之後(包括在末尾空)

你會結尾處有兩個零點,順便結束了。

0

這不是複製數組。我在同一個數組中移動數據。

for (p = text + 1; *p != '\0'; ++p) { 
    *p = *p + 1; 
} 

一個hackier的解決辦法是把「H」,其中「E」是,和返回一個指向新的開始。

*p + 1 = *p; 
p = p + 1; 
0

這應該做到這一點:

的memmove(P + 1,P + 2,4);

我們移動了四個字符,因爲我們也想複製空終止符。

0

沒有辦法刪除從C字符串什麼不復制下面的字符來填補漏洞。

但你可能改變你的數據結構,並使用一個字符串以外的東西。例如,您可以使用數組或字符串段的鏈接列表。這有時被稱爲「繩索」。

當然,當您需要將數據傳遞給其他需要C字符串的函數時,您必須複製整個事物。