C - Заменить несколько последовательных вхождений персонажа одним вхождением - PullRequest
0 голосов
/ 08 ноября 2019

Как я могу заменить несколько последовательных вхождений персонажа одним вхождением в C?

Например, если у меня есть char myString[]="??hello?world????", я бы хотел получить вывод в виде ?hello?world?.

Я нашел эту ссылку, но она заменяет определенный шаблон,Однако что, если есть переменное количество повторяющихся символов?

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

На всякий случай дополнительный ответ "??hello?world????" -> "?helo?world?"

#include <stdio.h>
#include<string.h>
int main()
{
    char myString[]="??hello?world????";
    int i,j,length=strlen(myString);
    char res[length];
    char prev;
    for(i=0,j=0;i<=length;i++)
    {
        if(i==0)
        {
            prev=myString[i];
            res[j]=prev;
            j++;
        }
        else
        {
            if(prev!=myString[i])
            {

                res[j]=myString[i];
                prev=res[j];
                j++;
            }
        }
    }
    printf("%s",res);
    return 0;
}
1 голос
/ 08 ноября 2019

Это можно сделать, используя один цикл.

Вот и вы.

#include <stdio.h>

char * remove_duplicates( char *s, char c )
{
    for ( char *p = s, *q = s; *q; )
    {
        if ( *++q != c || *p != c )
        {
            *++p = *q;
        }
    }

    return s;
}

int main(void) 
{
    char s[] = "??hello?world????";

    printf( "\"%s\"\n", s );
    printf( "\"%s\"\n", remove_duplicates( s, '?' ) );

    return 0;
}

Вывод программы:

"??hello?world????"
"?hello?world?"

Предполагается, что нользавершающий символ не должен указываться в качестве аргумента функции. В противном случае функция не имеет effetc и возвращает ту же строку.

...