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

Posted

技术标签:

【中文标题】从 C 字符串中去除第一个和最后一个字符【英文标题】:Strip first and last character from C string 【发布时间】:2010-12-16 03:02:08 【问题描述】:

我有一个 C 字符串,看起来像 "Nmy stringP",其中 N 和 P 可以是任何字符。如何在 C 中将其编辑为 "my string"

【问题讨论】:

家庭作业?如果是,请添加“作业”标签。 不,不是家庭作业——只是为了好玩而学习 C。 在纯 C 中没有“字符串”之类的东西。您是否有指向缓冲区 (char *) 或字符数组 (char[]) 的指针? 【参考方案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:“Nmy stringP”确实是一个文字字符串,但它被复制(逐个字符)到数组mystr。数组mystr 是可修改的。 文字字符串被复制到名为“mystr”的变量的位置。 mystr 不是指向文字的指针,它是文字的副本。 strdup() 不是标准函数。在提供它作为扩展的那些实现上,它的工作方式可能因实现而异。需要时我更喜欢malloc()strcpy()。不需要演示如何删除字符串的第一个和最后一个字符。 mystr 不是指针,它是一个用字符串文字的内容初始化的数组。他的代码是正确的。【参考方案2】:

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

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 的回答有什么问题,但在某些情况下,这不是您想要的。

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

最好不要依赖未定义的行为。 @xav0989 同意,我打算添加更多作为评论(强调不这样做的原因),而不是作为替代答案。我对此有点陌生。【参考方案4】:

最有效的方法:

//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* 函数操作输出。 是的,这是一个前提条件,是的,您可以添加一个长度参数。 1) “最安全的方式:”将使用 size_t len 而不是 int 2) 第二个代码假定 output 的大小比需要的大一号。例如。 char mod[10]; 将是 UB。

以上是关于从 C 字符串中去除第一个和最后一个字符的主要内容,如果未能解决你的问题,请参考以下文章

java中字符串如何去除最后一个字符

如何用C/C++实现去除字符串头和尾指定的字符

使用C语言如何取去掉一个字符串的首尾字符,新手求教各位大神,多谢啦。

shell脚本里,如何删除变量的最后一个字符?

prolog 怎么得到字符串第一个字符

java如何去掉字符串最后一个字符