从C字符串中删除第一个和最后一个字符

我有一个看起来像"Nmy stringP"的C字符串,其中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的答案有什么问题,但在某些情况下并不是你想要的。

最有效的方式:

 //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,也可以使用strdup进行第二种方式。

继@ pmg的回答之后,请注意您可以在一个语句中执行这两个操作:

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

这可能会按预期工作,但行为在C标准中未定义。