簡體   English   中英

從 C 字符串中去除第一個和最后一個字符

[英]Strip first and last character from C string

我有一個 C 字符串,看起來像"Nmy stringP" ,其中 N 和 P 可以是任何字符。 如何在 C 中將其編輯為"my string"

要“刪除”第一個字符指向第二個字符:

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) */

另一種選擇,再次假設“編輯”意味着您要就地修改:

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 標准中未定義。

最有效的方法:

//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 用於第二種方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM