从字符串中删除多余的空格-C编程

时间:2018-08-20 21:43:07

标签: c string pointers whitespace

任务是删除字符串中所有多余的空格,例如,如果字符串看起来像这样:

   volim      OR      

程序完成后,它应如下所示:

volim OR

所以程序必须删除字符串前后的所有空格以及单词之间的空格,因此最后每个单词之间只有一个空格。 这是我到目前为止所拥有的:

#include <stdio.h>

char *IzbaciViskaRazmake (char *Str)
{
    char *p = Str;
    char *p2 = Str;
    while(*p!='\0')
    {
        if(*p==' ')
            p++;
        else if(*p!=' ')
        {
            *p2 = *p;
            p2++;
            p++;
        }
    }
    *p2='\0';
    return Str;
}

int main() {
    char tekst[] = "        volim      OR      ";
    IzbaciViskaRazmake(tekst);
    printf("'%s'",tekst);
    return 0;
}

我的代码存在的问题是,它删除了所有空格,从而提供了输出

volimOR

我如何重新编写我的代码,因此它使单词之间保持空格。 PS-必须使用指针。

3 个答案:

答案 0 :(得分:1)

您可以通过将第一个(空格)添加到*p2并跳过其余的 (空格)来实现,方法是使用{{1} }。

尝试此修改后的代码,它将起作用:-

while-loop

输出:-

#include <stdio.h>

char *IzbaciViskaRazmake(char *Str)
{
    char *p = Str;
    char *p2 = Str;
    while (*p != '\0')
    {
        if (*p == ' ')
        {
            if (*p != *Str) // Not begining
            {
                *p2 = *p; // adding the first ' '
                p2++;
                p++;
            }
            while (*p == ' ') // skipping the rest ' '
            {
                p++;
            }
        }
        else
        {
            *p2 = *p;
            p2++;
            p++;
        }
    }
    if (*(p2 - 1) == ' ') //ends with space
    {
        p2--;
    }
    *p2 = '\0';

    return Str;
}

int main()
{
    char tekst[] = "        volim      OR      ";
    IzbaciViskaRazmake(tekst);
    printf("'%s'", tekst);
    return 0;
}

答案 1 :(得分:0)

Anoopknrs代码使我了解了此代码的实际工作方式,因此我设法迅速对其进行了修复。这是一项全面的工作,希望它能对其他人有所帮助。

#include <stdio.h>
#include <string.h>

    char *IzbaciViskaRazmake (char *Str)
    {
        char *p = Str;
        char *p2 = Str;
        while(*p!='\0')
        {
            if(*p==' ')
                p++;
            else if(*p!=' ')
            {
                *p2 = *p;
                p2++;
                p++;
                if(*p==' ')
                    {
                        *p2=*p;
                        p2++;
                        p++;
                    }
            }
        }
        *(p2-1)='\0';
        return Str;
    }

    int main() {
        char tekst[] = "        volim      OR      ";
        IzbaciViskaRazmake(tekst);
        printf("'%s'",tekst);
        return 0;
    }

答案 2 :(得分:0)

我认为您应该将其分为三个独立的任务:

  • 删除所有第一个非空白字符之前的空白
  • 删除最后一个非空白字符后的所有空白
  • 删除单词之间的所有空格

这是三个非常独立的任务,在您的情况下,一个合理的假设似乎只是将<compilation></compilation>视为空格。但是,这样的函数通常应该在失败时返回NULL指针。

因此我们可以声明此函数:

' '

现在您要编写三个函数,但是每个函数都比原始函数简单。

然后char * trimSpaces(char *str) { if(!str) return NULL; // If we get a NULL pointer as input if((str = trimInitialSpaces(str)) == NULL) return NULL; if((str = trimEndingSpaces(str)) == NULL) return NULL; if ((str = trimSuperfluousSpaces(str)) == NULL) return NULL; return str; } 的实现如下所示:

trimIntitialSpaces

您还有两个函数需要编写。 char * trimInitialSpaces(char *str) { if(!str) return NULL; char * ptr = str; int len = strlen(str); // Get length of string if(len == 0) return str; // If len is 0, there's nothing to do while(*ptr == ' ' && *ptr != '\0') ptr++; // Find first non-space // memmove can handle overlapping arrays, which memcpy cannot memmove(str, ptr, len-(ptr-str)+1); return str; } 有点棘手,但总的来说与trimEndingSpaces(str)几乎一样。然后,您只剩下trimInitialSpaces(str),这是最棘手的一个。但是现在您可以调试所有这三个单独的程序。祝你好运。