2012-02-14 48 views
1

我有一個字符數組填充了一些字符。假設我的char數組中有「HelloWorld」。 (不是字符串,佔用0到9的索引)在char數組中插入字符

我想要做的是在數組中間插入一個字符,並將其餘的字符推到一邊以便爲新字符騰出空間被插入。

所以,我可以讓char數組擁有「Hello.World」。

char ch[15]; // assume it has "HelloWorld" in it 
for(int i=0; i<=strlen(ch)-1; i++) { 
    if(ch[i]=='o' && ch[i+1]=='W') { 
     for(int j=strlen(ch)-1; j>=i+2; j--) { 
      ch[j] = ch[j-1]; // pushing process? 
     } 
     ch[i+1] = '.'; 
     break; 
    } 
} 

這項工作?會有更簡單的方法嗎?我可能會在這方面考慮太複雜。

+0

「對不起,但我應該再次質疑這個話題」。閱讀[寫出完美的問題](http://tinyurl.com/so-hints),這將幫助你得到你需要的答案。 – Johnsyweb 2012-02-14 23:11:34

+0

相關:http://stackoverflow.com/questions/9284916/how-to-push-char-array – amit 2012-02-14 23:11:36

+0

@Johnsyweb:現在似乎「不同」的問題對我來說。他尋求幫助,取得了一些進展,並再次陷入困境,並詢問如何解決問題。 – amit 2012-02-14 23:12:40

回答

2

如果您想通過一個所有字符拉昇,那麼你可以使用memmove做到這一點。

#include <string.h> 

char ch[15]; 

int make_room_at = 5; 
int room_to_make = 1; 

memmove(
    ch + make_room_at + room_to_make, 
    ch + make_room_at, 
    15 - (make_room_at + room_to_make) 
); 
3

你需要從strlen(ch) + 1,不strlen(ch) - 1啓動內循環,因爲你需要空終止向右移動一個地方爲好。請記住,strlen返回長度的字符串,例如string[strlen(string)] == '\0';您可以將strlen想象爲獲取C字符串的NULL結束符的索引的函數。

+0

哈哈我發現後立即發佈,所以我編輯它! – Haxify 2012-02-14 23:13:54

+0

@Haxify我更新了我的答案以反映您更新的問題。 – 2012-02-14 23:15:39

1

只需做:

#define SHIFT 1 
char bla[32] = "HelloWorld"; // We reserve enough room for this example 
char *ptr = bla + 5;   // pointer to "World"  
memmove(ptr + SHIFT, ptr, strlen(ptr) + 1); // +1 for the trailing null 
1

用於內環路的初始起點值是一個短。它應該像下面這樣。還要注意的是,由於字符被移動到右側,一個新的空終止需要添加:「這是一個很好的方式」

ch[strlen(ch) + 1] = '\0'; 
    for(j=strlen(ch); j>=i+2; j--) { // note no "-1" after the strlen 

編輯至於部分,我認爲這是合理的;它只取決於預期的目的。一些想法浮現在腦海中:

  • 減少對strlen的調用可能是好的。這可能取決於優化器的優點(可能有些優化器可能會被優化)。但是,每次調用strlen都需要掃描字符串以查找空終止符。在高流量的代碼中,這可以加起來。因此,將初始長度存儲在變量中,然後在別處使用變量可能會有所幫助。
  • 這種類型的操作有可能導致緩衝區溢出。始終確保緩衝區足夠長(它在OP中)。
0

如果你要操縱一個字符數組,你不應該使它成爲靜態的。通過這樣做:

char ch[15]; 

你硬編碼陣列總是有它的15個字符。使其成爲一個指針將是第1步:

char* ch; 

這樣你就可以修改它需要的話。

相關問題