我有一個看起來像"Nmy stringP"
的C字符串,其中N和P可以是任何字符。我如何將它編輯爲C中的"my string"
?從C字符串中剝離第一個字符和最後一個字符
回答
要「刪除」的第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) */
這可能不起作用,因爲通過將「Nmy stringP」初始化爲文字,編譯器/鏈接器可以將其放置在只讀存儲器中,導致編輯失敗。 – Suppressingfire 2009-11-13 00:14:18
@Suppressingfire:「Nmy stringP」確實是一個文字字符串,但它被複制(char by char)到數組mystr'。數組'mystr'是可修改的。 – pmg 2009-11-13 00:17:25
@pmg:你在哪裏複製? 'char * p = mystr'將'p'指向'mystr',它不會複製'mystr'。 – quark 2009-11-13 00:23:03
的最有效方式:
//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作爲第二種方法。
我在第二個實現中看到的問題是你需要確保你的輸出足夠大在調用getAllBufFirstAndLast()之前處理該副本。在這種情況下,我建議在調用中添加一個outputLength變量,並讓被調用的函數用strn *函數處理輸出。 – shank 2009-11-13 14:10:01
是的,這是一個先決條件,你可以添加一個長度參數。 – 2009-11-13 14:11:13
另一種選擇,再次假定「編輯」意味着你要到位,以修改:
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的答案有任何問題,但在某些情況下,這不是你想要的。
繼@ PMG的回答,請注意,你可以在一個聲明中做兩個操作:
char mystr[] = "Nmy stringP";
char *p = mystr;
p++[strlen(p)-1] = 0;
這是預期,但行爲在C標準未定義都會很成功。
最好不要依賴未定義的行爲。 – T0xicCode 2012-12-08 21:52:40
@ xav0989同意,我打算更多地將其作爲評論添加(突出顯示不這樣做的原因),而不是作爲備選答案。我在這方面有點新鮮。 – 2012-12-10 15:43:04
- 1. 字符串的第一個字符和最後一個字符
- 2. 剝字符串的第一個字符
- 3. 去掉字符串中的最後一個字符和第一個字符
- 4. 刪除字符串中的最後一個字符和第一個字符
- 5. cout:最後一個字符串覆蓋第一個字符串
- 6. 從字符串中剝離字符F#
- 7. 如何剝離的第一個字符
- 8. 如何從字符串中刪除第一個和最後一個字符
- 9. 如何使用sed從字符串中剝離第一個X字符?
- 10. 如何創建子字符串,當我知道C#字符串中的第一個和最後一個字符?
- 11. jQuery給定字符的第一個和最後一個字符
- 12. BASH - 簡單的第一個字符和最後一個字符
- 13. 帶字符串中第一個和最後一個字符的返回範圍
- 14. 通過第一個和最後一個字符刪除一部分字符串?
- 15. PHP - 剝開一個特定的字符串一個字符串
- 16. 剝離字符串
- 17. 從字符串數組中獲取第一個字符串c
- 18. 在字符'?'之後從字符串中獲取最後一個字符串
- 19. 最後一個字符串
- 20. 動態刪除最後一個字符串後/從字符串
- 21. 在字符串的第一個和最後一個位置插入字符
- 22. 字符串中最後一個數字
- 23. C - 從另一個字符串中減去一個字符串
- 24. objective-c獲取一個字符串的最後2個字符?
- 25. Python - 需要從字符串中提取第一個和最後一個字母
- 26. 如何用此字符串中的兩個不同字符替換第一個和最後一個字符「{0}」
- 27. 修剪字符串,刪除C中的最後一個字符#
- 28. Objective C - 刪除字符串中的最後一個字符
- 29. 如何獲取C++中字符串的最後一個字符
- 30. C++獲取字符串中的最後一個字符
作業?如果是,添加「作業」標籤。 – pmg 2009-11-13 00:10:05
不,不是作業 - 只是想學習C的樂趣。 – igul222 2009-11-13 00:18:39
在純C中,不存在「串」這樣的東西。你有一個指向緩衝區('char *')或字符數組('char []')的指針嗎? – 2009-11-13 00:32:23