1
resposta

Como deletar inputs repetidos em um array?

Estou tentando resolver um exercício onde o usuário digite em uma única string vários produtos e o programa deve separar esses produtos cada um em uma posição na string e depois deletar os repetidos e imprimi-los em ordem alfabética, eu consegui fazer a primeira parte, receber um input do usuário e guardar cada produto digitado em uma posição do array, mas não estou sabendo apagar os produtos repetidos, como faço para encontrar eles e apaga-los do array? (creio que deve ser usando for eninhados) Meu código esta assim ate agora:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
    char *list[1000];
    char input[1000];


    printf("Type:\n"); //test

    scanf("%999[^\n]", &input);

    int count = 0;

    char* split = strtok(input, " ");
    while (split != NULL) 
    {
        list[count] = split;
        count++;
        split = strtok(NULL, " ");
    }

    for (int i = 0; i < count; i++)
    {

    }


    for (int p = 0; p < count; p++){
        printf("%s\n", list[p]);
    } //test




    return 0;
}
1 resposta

Olá Tibério, tudo bem ? Espero que sim.

A solução que pensei foi percorrer o array com um for aninhado, para olhar para um item do array e comparar com o restante dele, se for igual escrever ERRO no lugar, essa palavrar vai servir como uma flag para um segundo momento.


    for (int i = 0; i < count; i++)
    {
        for (int j = i+1; j < count; j++)
        {
            if(strcmp(list[i], list[j]) == 0){
                strcpy(list[j], "ERRO");
            }
        }
    }

Agora que já conseguimos substituir as palavras repetidas pela flag, podemos percorrer toda a lista e copiar tudo que não for a flag para um novo array;

    char list_2[1000][1000];
    int count_lista2 = 0;
    for (int j = 0; j < count; j++)
    {
        if(strcmp(list[j], "ERRO") != 0){
            strcpy(list_2[count_lista2++], list[j]);
        }
    }    

Finalmente com a nova lista criada podemos imprimi-la:

    printf("List:\n");
    for (int p = 0; p < count_lista2; p++){
        printf("%s\n", list_2[p]);
    } 

Essa foi a solução que pensei, provavelmente existem outras soluções diferentes, mas essa já resolve o proposto.

Espero ter ajudado, qualquer duvida não hesite em perguntar.

Bons Estudos.