繁体   English   中英

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

[英]Removing extra whitespaces from a string - C programming

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

   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-必须使用指针。

您可以通过添加第一个 (空格)到*p2并跳过其余部分 (空白)使用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;
}

输出:-

'volim OR'

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;
    }

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

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

这是三个非常独立的任务,在您的情况下,一个合理的假设似乎只是将' '视为空格。 但是,这样的函数通常应该在失败时返回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)几乎相同。 然后只剩下trimSuperfluosSpaces(str) ,这是最棘手的一个。 但是现在您可以调试所有这三个单独的程序。 祝好运。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM