Заменить повторяющиеся соседние символы другими символами. - PullRequest
0 голосов
/ 24 марта 2019

Проблема

Если у вас есть два повторяющихся символа, которые вы укажете в своем вводе, например, вы введете «*», вы будете заменять «**» на каждой отдельной строке, когда рядом с другимиперсонаж как «А», как бы вы это сделали?

Я подумал об использовании массива для хранения каждого отдельного символа, и перебрал массив, используя индекс i, проверил, если arr[i] = arr[i+1]="*", и просто заменил его.

Но КТО ОДИН из вас заменит, и как вы убедитесь в этом, и как вы его замените?Так как раньше два индекса занимали "*", а теперь мы заменяем его только одним.

1 Ответ

0 голосов
/ 24 марта 2019

Я понимаю, что вы спрашиваете. В вашем случае, если у вас есть "**", вы хотите заменить эти 2 символа на 'A'. Это довольно легко сделать. Вы просто зацикливаетесь на каждом символе ввода, задерживая оценку последовательности, пока не прочитаете 2 символа (просто сохраните current как last в конце цикла и достаточно использовать last в качестве флага)

Тогда, если current == last и last == find символ, заменить последовательность и получить следующий входной символ, в противном случае просто выведите символ last.

Короткий пример, который переводит символ последовательности в find в качестве первого аргумента (используя '*', если аргументы не предоставлены) и символ repl в качестве второго аргумента (используя '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',

$ echo "There are two **** in the sky" | ./bin/replseqchar '*' -
There are two -- in the sky
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...