将重复出现的相邻字符替换为其他字符

时间:2019-03-23 21:17:02

标签: c

问题

如果您要在输入中指定两个重复出现的字符,例如,输入“ *”,则在与“ A”等其他字符相邻时,每行都将替换“ **”你会那样做吗?

我想到了使用数组存储每个字符,并使用索引i遍历数组,检查arr[i] = arr[i+1]="*",然后简单地替换它。

但是您将替换哪一个,如何确定以及如何替换呢?由于之前两个索引都由“ *”占据,现在我们只用一个替换它。

1 个答案:

答案 0 :(得分:0)

我了解您的要求。对于您的情况,如果您有"**",则要用'A'替换那些2个字符。那很容易做到。您只需遍历输入的每个字符,就可以延迟对序列的求值,直到读取2个字符为止(只需在循环结束时将current保存为last,并使用last作为标记就足够了)

如果是current == lastlast == find字符,则替换序列并获得下一个输入字符,否则,只需输出last字符。

一个简短的示例,将序列字符以find作为第一个参数(如果未提供参数,则使用'*'),并将repl字符作为第二个参数(使用{{ 1}}(如果未提供任何参数)将为:

'A'

使用/输出示例

#include <stdio.h>

int main (int argc, char **argv) {

    int c,                                  /* current char */
        find = argc > 1 ? *argv[1] : '*',   /* sequential char to find */
        repl = argc > 2 ? *argv[2] : 'A',   /* replacement for seq chars */
        last = 0;                           /* previous char */

    while ((c = getchar()) != EOF) {        /* read each char */
        if (last) {                         /* is last set? */
            if (c == last && last == find) {/* do we have sequence? */
                putchar (repl);             /* output replacement */
                last = 0;                   /* set last 0 */
                continue;                   /* go get next char */
            }
            else    /* otherwise */
                putchar (last);     /* just output last */
        }
        last = c;   /* set last = current */
    }
    if (last)           /* if last wasn't zeroed */
        putchar (last); /* just output final char */

    return 0;
}

,或者使用$ echo "There are two ** in the sky" | ./bin/replseqchar There are two A in the sky $ echo "There are two *** in the sky" | ./bin/replseqchar There are two A* in the sky $ echo "There are two **** in the sky" | ./bin/replseqchar There are two AA in the sky 代替'-'进行替换,

'A'