Манипулирование строкой (вывод переменной с одинаковым вводом) - PullRequest
0 голосов
/ 24 мая 2018

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

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

    }

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

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

#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;
}
0 голосов
/ 24 мая 2018

Вам нужно начать внутренний цикл со следующего символа после того, как он обрабатывается во внешнем цикле, в противном случае вы будете обрабатывать одну и ту же пару символов дважды, а также будете проверять символ против себя, когда 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);

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...