从C字符串中去掉第一个和最后一个字符

从C字符串中去掉第一个和最后一个字符,c,string,c-strings,C,String,C Strings,我有一个C字符串,看起来像“Nmy stringP”,其中N和p可以是任何字符。如何在C语言中将其编辑为“我的字符串”。要将第一个字符指向第二个字符,请执行以下操作: 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

我有一个C字符串,看起来像
“Nmy stringP”
,其中N和p可以是任何字符。如何在C语言中将其编辑为
“我的字符串”

要将第一个字符指向第二个字符,请执行以下操作:

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

最有效的方法是:

//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作为第二种方法

另一个选项,再次假设“编辑”意味着您要就地修改:

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标准中未定义。

?如果是的话,添加“家庭作业”标签。不,不是家庭作业-只是为了好玩而尝试学习C。在纯C中没有“字符串”这样的东西。您是否有指向缓冲区(
char*
)或字符数组(
char[]
)的指针?这可能不起作用,因为通过将“Nmy stringP”初始化为文本,编译器/链接器可以将其放在只读内存中,从而导致编辑失败。@Suppressingfire:“Nmy stringP”确实是一个文本字符串,但它是逐字符复制的到数组
mystr
。数组
mystr
是可修改的。文本字符串被复制到名为“mystr”的变量的位置。mystr不是指向文本的指针,它是文本的副本。
strdup()
不是标准函数。它在作为扩展提供它的那些实现上的工作方式可能因实现而异。需要时,我更喜欢
malloc()
strcpy()
。不需要演示如何删除字符串的第一个和最后一个字符。mystr不是指针,它是一个用字符串文本内容初始化的数组。他的代码是正确的。我发现第二个实现的问题是,在调用getAllBufFirstAndLast()之前,需要确保输出足够大,足以处理副本。在这种情况下,我建议将outputLength变量添加到调用中,并让被调用函数使用strn*函数操作输出。是的,这是一个先决条件,是的,您可以添加一个长度参数。1)“最安全的方法:”将使用
size\t len
而不是
int
2)第二个代码假定
output
的大小比需要的大一个。例如,
charmod[10]将是UB。但最好不要依赖未定义的行为。@xav0989同意,我打算添加更多内容作为注释(强调不这样做的原因),而不是作为替代答案。我在这方面有点生疏。