2009-11-13 195 views
24

我有一個看起來像"Nmy stringP"的C字符串,其中N和P可以是任何字符。我如何將它編輯爲C中的"my string"從C字符串中剝離第一個字符和最後一個字符

+2

作業?如果是,添加「作業」標籤。 – pmg 2009-11-13 00:10:05

+0

不,不是作業 - 只是想學習C的樂趣。 – igul222 2009-11-13 00:18:39

+1

在純C中,不存在「串」這樣的東西。你有一個指向緩衝區('char *')或字符數組('char []')的指針嗎? – 2009-11-13 00:32:23

回答

46

要「刪除」的第1個字符點到第二個字符:

char mystr[] = "Nmy stringP"; 
char *p = mystr; 
p++; /* 'N' is not in `p` */ 

要刪除的最後一個字符用「\ 0」替換

p[strlen(p)-1] = 0; /* 'P' is not in `p` (and it isn't in `mystr` either) */ 
+3

這可能不起作用,因爲通過將「Nmy stringP」初始化爲文字,編譯器/鏈接器可以將其放置在只讀存儲器中,導致編輯失敗。 – Suppressingfire 2009-11-13 00:14:18

+8

@Suppressingfire:「Nmy stringP」確實是一個文字字符串,但它被複制(char by char)到數組mystr'。數組'mystr'是可修改的。 – pmg 2009-11-13 00:17:25

+0

@pmg:你在哪裏複製? 'char * p = mystr'將'p'指向'mystr',它不會複製'mystr'。 – quark 2009-11-13 00:23:03

1

的最有效方式:

//Note destroys the original string by removing it's last char 
// Do not pass in a string literal. 
char * getAllButFirstAndLast(char *input) 
{ 
    int len = strlen(input); 
    if(len > 0) 
    input++;//Go past the first char 
    if(len > 1) 
    input[len - 2] = '\0';//Replace the last char with a null termination 
    return input; 
} 


//... 
//Call it like so 
char str[512]; 
strcpy(str, "hello world"); 
char *pMod = getAllButFirstAndLast(str); 

最穩妥的辦法:

void getAllButFirstAndLast(const char *input, char *output) 
{ 
    int len = strlen(input); 
    if(len > 0) 
    strcpy(output, ++input); 
    if(len > 1) 
    output[len - 2] = '\0'; 
} 


//... 
//Call it like so 
char mod[512]; 
getAllButFirstAndLast("hello world", mod); 

第二種方式效率較低,但它更安全,因爲您可以將字符串文字傳入輸入。如果你不想自己實現它,你也可以使用strdup作爲第二種方法。

+0

我在第二個實現中看到的問題是你需要確保你的輸出足夠大在調用getAllBufFirstAndLast()之前處理該副本。在這種情況下,我建議在調用中添加一個outputLength變量,並讓被調用的函數用strn *函數處理輸出。 – shank 2009-11-13 14:10:01

+0

是的,這是一個先決條件,你可以添加一個長度參數。 – 2009-11-13 14:11:13

9

另一種選擇,再次假定「編輯」意味着你要到位,以修改:

void topntail(char *str) { 
    size_t len = strlen(str); 
    assert(len >= 2); // or whatever you want to do with short strings 
    memmove(str, str+1, len-2); 
    str[len-2] = 0; 
} 

這會修改字符串到位,不作爲PMG的解決方案不會產生一個新的地址。不是說pmg的答案有任何問題,但在某些情況下,這不是你想要的。

2

繼@ PMG的回答,請注意,你可以在一個聲明中做兩個操作:

char mystr[] = "Nmy stringP"; 
char *p = mystr; 
p++[strlen(p)-1] = 0; 

這是預期,但行爲在C標準未定義都會很成功。

+0

最好不要依賴未定義的行爲。 – T0xicCode 2012-12-08 21:52:40

+1

@ xav0989同意,我打算更多地將其作爲評論添加(突出顯示不這樣做的原因),而不是作爲備選答案。我在這方面有點新鮮。 – 2012-12-10 15:43:04

相關問題