【问题标题】:Replacing several characters in string with one in C用C中的一个替换字符串中的几个字符
【发布时间】:2020-04-06 07:26:55
【问题描述】:

我需要用一个替换几个字符(取决于它们的计数是偶数还是奇数)。如果是偶数,我应该用 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

我不知道如何删除几个我知道如何输入的字符。

【问题讨论】:

  • 你为什么要找'*'。你应该在找'+',对吧?

标签: c string replace char c-strings


【解决方案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);
}

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

【讨论】:

  • text[index++] = count == 2 ? 'P' : 'p'; 应该是text[index++] = count % 2 ? 'p' : 'P'; 不应该吗?
  • @Rexy 这个答案修改了字符串。为此,您需要有两个位置:源索引(他称之为 i)和目标索引(他称之为索引)。如果连续有多个 +,则两者将不相等 - 没有办法用一个索引来做到这一点。
  • 从“推理代码”的角度来看,我更喜欢将 count 初始化为 0,并在下一行交换 'P' 和 'p'。否则我想知道“为什么我们从一个开始?”
  • @Rexy 我现在浏览了这段代码的不同版本,但我似乎无法重现该错误。现在复制我帖子中的代码,它对我有用。
  • printf(text);text 有点不确定,一般来说,可能包含 "%"。考虑printf("%s", text); 之类的。
【解决方案2】:

如果我理解正确你不知道如何实现相应的功能。

它可以看起来像演示程序中显示的那样。

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

【讨论】:

  • @Rexy 你写的是奇数或偶数。查看演示程序的输出。
  • if ( dsn != src ) *dsn = *src;*dsn = *src; 相比有什么特别的原因吗?
  • @chux-ReinstateMonica 无法访问内存,因此代码可以更高效。例如,指针本身可以存储在寄存器中。
猜你喜欢
  • 2011-02-10
  • 1970-01-01
  • 2022-11-03
  • 1970-01-01
  • 2021-06-15
  • 1970-01-01
  • 1970-01-01
  • 2016-02-04
  • 2021-10-27
相关资源
最近更新 更多