从字符串中删除空格不会返回任何内容

时间:2018-09-07 08:33:52

标签: c

此代码从字符串中删除空格。

char *RemoveSpaces(char *source)
{  
    char* i = source;
    char* j = source;
    while(*j != '\0')
    {
        *i = *j++;
        if(*i != ' ')
            i++;
    }
    *i = 0;
    return i;
}

但是当我使用printf时,它什么也不会返回。

printf("%s", RemoveSpaces("HELLO WORLD!!! COME ONE\r"));

2 个答案:

答案 0 :(得分:2)

*i = 0;
return i;   // wrong pointer returned

是错误的。它返回一个指向字符串终止的指针(即指向0的指针)。因此它什么也不打印。

尝试:

*i = 0;            // or *i = '\0';
return source;     // correct pointer returned

此外,不允许修改字符串文字。而是:

char str[] = "HELLO WORLD!!! COME ONE\r";
printf("%s", RemoveSpaces(str));

答案 1 :(得分:1)

稍微调整一下空间删除逻辑可能会使事情更有意义。而不是设置

    *i = *j++;
    if(*i != ' ')
        i++;

在测试是否*i != ' '之前,您可能会发现先测试然后再赋值(其中p是您的iep(结束指针)更有意义是您的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 source(可能会出现SegFault)。在默认情况下,在 compound-literal 上方用于确保测试过去是可修改的字符数组。

使用/输出示例

$ ./bin/rmspaces
HELLOWORLD!!!COMEONE

仔细检查一下,如果还有其他问题,请告诉我。