Обработка строк (переменный вывод с одним и тем же вводом)

-1 raijin [2018-05-24 00:16:00]

Возможно, какое-то свойство для меня незаметно, но когда "i" 1, он просто замерзает. Когда я ввожу любую строку, переменная "j" переходит на 700 или 2000 в разных исполнениях. Цель кода состоит в том, чтобы выводить повторяющиеся буквы, если вы вводите "сыр", выход должен быть "eee". Что я делаю неправильно?

    #include <stdio.h>
    char * repeticoes(char *s) {
        int index = 0;

        for (int i = 0;( s[i] != '\0'); i++) //problem starts when i is > 0
        {
            for (int j = 0; ( s[j] != '\0'); j++)
            {
                if (s[i] == s[j])
                {
                    printf("%c == %c\ni %d  j %d\n", s[i], s[j],i,j);
                    s[index++] = s[i];

                }
                else
                {
                    printf("not happening %c != %c\ni %d  j %d\n", s[i],s[j],i,j);
                }
            }

        }

        s[++index] = '\0';
        return s;
    }

    main() {
        char input[21];

        printf("str 1\n");
        fgets(input, 20, stdin);
        repeticoes(input);
        printf("duplicated letters %s\n", input);

    }

c function string


2 ответа


0 Решение user3121023 [2018-05-24 01:46:00]

С массивом букв для подсчета и массивом подсчетов. После того, как буквы будут подсчитаны, снова проведите через вход и установите буквы, которые имеют счет больше одного.

#include <stdio.h>

void repeticoes ( char *s) {
    char tocount[] = "abcdefghijklmnopqrstuvwxyz";
    size_t len = sizeof tocount;
    size_t index = 0;
    int count[len];

    for (int j = 0; j < len; j++) {
        count[j] = 0;
    }

    for (int i = 0;( s[i] != '\0'); i++) {
        for (int j = 0; j < len; j++) {
            if ( s[i] == tocount[j]) {
                count[j]++;
            }
        }
    }
    for (int i = 0;( s[i] != '\0'); i++) {
        for (int j = 0; j < len; j++) {
            if ( s[i] == tocount[j] && 1 < count[j]) {
                s[index] = s[i];
                index++;
            }
        }
    }
    s[index] = '\0';
}

int main ( void) {
    char input[21];

    printf("str 1\n");
    fgets(input, 20, stdin);
    repeticoes(input);
    printf("duplicated letters %s\n", input);

    return 0;
}

1 Barmar [2018-05-24 00:53:00]

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

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

И вы не должны увеличивать index до назначения нулевого символа после цикла. Он был добавлен при добавлении повторения.

#include <stdio.h>
char * repeticoes(char *s) {
    int index = 0;

    for (int i = 0;( s[i] != '\0'); i++) //problem starts when i is > 0
    {
        for (int j = i+1; ( s[j] != '\0'); j++)
        {
            if (s[i] == s[j])
            {
                printf("%c == %c\ni %d  j %d\n", s[i], s[j],i,j);
                s[index++] = s[i];
                break;
            }
            else
            {
                printf("not happening %c != %c\ni %d  j %d\n", s[i],s[j],i,j);
            }
        }

    }

    s[index] = '\0';
    return s;
}

int main() {
    char input[21];

    printf("str 1\n");
    fgets(input, 20, stdin);
    repeticoes(input);
    printf("duplicated letters %s\n", input);

}