C 仅通过指针操作删除字符串中的前导和尾随空格

C Remove leading and trailing spaces in string by pointer manipulation only

我一直在尝试仅通过操作指针(不将字符复制到 char 数组)来从 C 字符串中删除前导和尾随 space。到目前为止的想法是这样的:

void trim_string(char *str)
{
    char *ptr = str;

    // This part removes leading spaces
    while(*ptr == ' ') ++ptr;
    while (*str++ = *ptr++);

    // This part removes trailing spaces
    str--;
    while(*str == ' ') --str;
    str++;
    *str = *ptr;
}

但是删除尾随 space 的部分不起作用。

删除前导 spaces 部分后,*str 和 *ptr 应该位于字符串的末尾; '\0' 字符。这个想法是通过字符串向后移动一个指针,直到检测到非 space 字符,而另一个指针仍然指向 '\0'。然后将最后一个 space 字符指向另一个指针(仍指向 '\0'),以终止字符串。

使用该逻辑移动/重新分配尾随 space 部分的空指针的正确方法是什么?

既然你这样做了:

while (*str++ = *ptr++);

访问 ptr 指向的内容在这一点之后不再是有效操作(它可能导致内存访问冲突,更普遍的是 - 程序的未定义行为)。

但这正是您在代码的最后一行所做的:

*str = *ptr;

除此之外,请注意,为了 trim str 指向的字符串,您需要执行以下任一操作:

  • *str = 0
  • str[i] = 0 对于 i
  • 的某个非负整数值

所以当你的目的是trim输入那个字符串时,*str = *ptr真的没有意义。