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
真的没有意义。
我一直在尝试仅通过操作指针(不将字符复制到 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
真的没有意义。