用C

时间:2019-12-12 20:47:08

标签: c string replace char c-strings

我需要用一个字符替换几个字符(取决于它们的计数是偶数还是奇数)。如果是偶数,我应该用P替换+,如果p奇数。

输入:kjlz ++ zux +++

while(p[i])
{
    j=i;
    k=i;
    length=strlen(p);

    if(p[i]=='*')
    {
        position=i;
    }
    printf("Position is: %d", position);

    while(p[j]=='*')
    {
        counter++;
        j++;
    }
}

输出:kjlzPzuxp

我不确定如何删除几个我知道该怎么输入的字符。

2 个答案:

答案 0 :(得分:1)

基本上,您可以保持 text 变量不变,直到找到+。在这种情况下,您开始计算有多少个连续的加号。一旦知道这一点,就可以决定是否应添加字母P或p。保留一个单独的索引以写回您的文本变量!否则,在发现2或3个加号之后,它将开始写入错误的索引,请尝试找出原因;)。

#include <stdio.h>
#include <stdlib.h>

int main (void)
{
    char text[] = "kjlz++zux+++";
    int len = sizeof(text) / sizeof(text[0]);
    int index = 0, count = 0;

    for(int i = 0; i < len; i++)
    {
        if(text[i] == '+')
        {
            count = 0;
            while(text[i] == '+') i++, count++;
            i--;
            text[index++] = count % 2 ? 'p' : 'P';
        }
        else
        {
            text[index++] = text[i];
        }
    }
    text[index] = 0;
    printf(text);
}

您可以使用 malloc text 变量分配空间,以便以后可以使用 realloc 将数组缩小到输出文字。这样可以节省一些内存,当您开始处理更大的数据块时,这一点尤其重要。

答案 1 :(得分:1)

如果我已正确理解,您将不知道如何实现相应的功能。

它可以按照演示程序中所示的方式进行查找。

#include <stdio.h>

char * replace_pluses( char *s )
{
    const char plus = '+';
    const char odd_plus = 'p';
    const char even_plus = 'P';

    char *dsn = s;

    for ( char *src = s; *src;  )
    {
        if ( *src == plus )
        {
            int odd = 1;
            while ( *++src == plus ) odd ^= 1;

            *dsn++ = odd ? odd_plus : even_plus;
        }
        else
        {
            if ( dsn != src ) *dsn = *src;
            ++dsn;
            ++src;

        }
    }

    *dsn = '\0';

    return s;
}

int main(void) 
{
    char s[] = "kjlz++zux+++";

    puts( s );
    puts( replace_pluses( s ) );

    return 0;
}

程序输出为

kjlz++zux+++
kjlzPzuxp

或者您可以编写一个更通用的函数

#include <stdio.h>

char * replace_odd_even_duplicates( char *s, char c1, char c2, char c3 )
{
    char *dsn = s;

    for ( char *src = s; *src;  )
    {
        if ( *src == c1 )
        {
            int odd = 1;
            while ( *++src == c1 ) odd ^= 1;

            *dsn++ = odd ? c2 : c3;
        }
        else
        {
            if ( dsn != src ) *dsn = *src;
            ++dsn;
            ++src;

        }
    }

    *dsn = '\0';

    return s;
}

int main(void) 
{
    char s[] = "kjlz++zux+++";

    puts( s );
    puts( replace_odd_even_duplicates( s, '+', 'p', 'P' ) );

    return 0;
}