我有一个看起来像"Nmy stringP"
的C字符串,其中N和P可以是任何字符。如何在C中将其编辑为"my string"
?
答案 0 :(得分:51)
将第一个字符点“移除”到第二个字符:
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) */
答案 1 :(得分:11)
另一种选择,再次假设“编辑”意味着您要在适当位置进行修改:
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 :(得分: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,也可以使用strdup进行第二种方式。
答案 3 :(得分:1)
继@ pmg的回答之后,请注意您可以在一个语句中执行这两个操作:
char mystr[] = "Nmy stringP";
char *p = mystr;
p++[strlen(p)-1] = 0;
这可能会按预期工作,但C标准中的行为未定义。