对您的空间删除逻辑稍作调整可能会让事情变得更有意义。而不是设置
*i = *j++;
if(*i != ' ')
i++;
在您测试是否*i != ' ' 之前,您可能会发现先测试然后分配更有意义(其中p 是您的i,ep(结束指针)是您的j),例如
while (*ep) { /* iterate ep from beginning to end of src */
if (*ep != ' ') /* if its not a space */
*p++ = *ep; /* set begin pointer to char at end ptr, advance */
ep++; /* advance to next char */
}
*p = 0; /* nul-terminate src at p */
从这个意义上说,如果当前字符不是空格,您只分配和推进初始指针。
在您的示例和此处,您正在修改source 的内容,您的'i' 和'j' 指针用于迭代source 中的字符,因此当您完成迭代时,你 return source (或者源可以在调用者中使用而无需返回,因为你正在就地修改 source 的内容。
将这些部分放在一起,您可以执行类似以下的操作,将字符串作为代码的第一个参数删除空格(如果没有给出参数,则默认使用"HELLO WORLD!!! COME ONE\n"),例如
#include <stdio.h>
char *rmspaces (char *src)
{
char *p = src, /* pointer to beginning of src */
*ep = src; /* pointer to iterate to the end of src */
while (*ep) { /* iterate ep from beginning to end of src */
if (*ep != ' ') /* if its not a space */
*p++ = *ep; /* set begin pointer to char at end ptr, advance */
ep++; /* advance to next char */
}
*p = 0; /* nul-terminate src at p */
return src;
}
int main (int argc, char **argv) {
char *s = argc > 1 ? argv[1] : (char[]){"HELLO WORLD!!! COME ONE\n"};
printf ("%s", rmspaces (s));
return 0;
}
(注意:,您的就地编辑很好,但在我的情况下,source(或src)必须是可修改的,这意味着您不能通过 string-literal as source(这可能是 SegFault)。在默认情况下使用 compound-literal 以确保过去的测试是可修改的字符数组)
使用/输出示例
$ ./bin/rmspaces
HELLOWORLD!!!COMEONE
检查一下,如果您还有其他问题,请告诉我。