Ir ao conteúdo
  • Cadastre-se

C uma maozinha pro meu cod. em C, para comparar se há repetições


Thayron Oliveira

Posts recomendados

Preciso de uma ajuda em um código pré criado, necessito que uma string de char com caracteres de números e ' , ' (virgula) (por exemplo: '0,0,1,2,63,1,0,63,12') NÃO contenha mais nenhum carácter repetido a não ser a virgula, q fique por exemplo: '0,1,2,63,12'

 

O código até o momento não realoca o vetor no espaço do numero antigo encontrado, apenas armazena uma virgula la deixando por exemplo: '0,,,1,2,63,,,,,,,,12'. Porém não está rodando, precisava fazer com que pelo menos essa parte que eu escrevi seja funcional, poderiam me ajudar a achar o erro? estou quebrado a cabeça há mt tempo 😕

aqui esta o código:

 

void verificaRep(char vetor[], int tamanhovet){		//verifica repetições (referenciando por ,)
	char comp1[100], comp2[100];
	int i=0, j=0, k=0, l=0, m=0, n=0, tam1=0, tam2=0, verifica=0;
	for(i=0;i<tamanhovet;i++){		//percorre todo o vetor
		while(vetor[i]!=','){
			comp1[j]=vetor[i];		//armazena o estado a ser comparado
			j++;
			tam1++;
			i++;
		}
		
		for(l=i; l<tamanhovet; l++){
			l++; 		//incrementa porque tem a virgula
			while(vetor[l]!=','){		//adiciona um novo estado para ser comparado
				comp2[m]=vetor[l];
				l++;
				tam2++;	//tamanho a ser verificado
				m++;
			}
			tam2=strlen(comp2);
			if(tam1==tam2){						//se eles tem o mesmo tamanho
				for(n=0;n<tam1;n++){	//percorre o tamanho da casa do vetor a ser comparado
					if(comp1[n]==comp2[n]){			//se sao iguais as comparaçoes
						verifica++;			//a aux verifica incrementa
					}
				}
				if(verifica==tam1){		//se o tamanho deles é igual a aux verifica
					vetor[i]=',';
				}
			}
		}
	}
}

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@Thayron Oliveira    creio que comparar int seja mais fácil ,  então convertendo esse vetor de char ou string ,  para int e aí fazer as comparações e remover os repetidos , depois converter novamente para string , e seu código com algumas modificações poderia ser assim  :

#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <time.h>
void verificaRep(char vetor[], int tamanhovet){		//verifica repetições (referenciando por ,)
    int num[100],i=0,k,w=0,aux;
    char val[10];
    printf("\n\n\n\tVetor inicial -------> %s\n",vetor);
    do{
        k=0;
        while(vetor[i]!= ','){
            if(vetor[i]=='\0')break;
            val[k]=vetor[i];
            i++;
            k++;
        }
        if(vetor[i]!='\0')i++;
        val[k]='\0';
        num[w]=atoi(val);
        w++;
    }while(vetor[i]!='\0');
    for(i=0;i<w-1;i++)/* ordenar o vetor */
        for(k=i+1;k<w;k++)
            if(num[i] > num[k]){
                aux   = num[i];
                num[i]= num[k];
                num[k]= aux;
            }
    int y=1,r=w,j;
    for(i=0;i<w;i++){
        if(num[i]==NULL)
            y=0;
    }
    for(i=0;i<r;i++){
        for(j=i+1;j<r;j++){
            if(num[i]==num[j]){
                num[j]=NULL;
            }
        }
    }
    k=0;
    if(y != 1){
        itoa(y,val,10);
        strcpy(vetor,val);
    }
    else
        strcpy(vetor,"");
    strcat(vetor,",");
    for(i=0;i<w*2-1;i+=2){
        if(num[k]!=NULL){
            itoa(num[k],val,10);
            strcat(vetor,val);
            strcat(vetor,",");
        }
        k++;
    }
    vetor[strlen(vetor)-1] = '\0';
    printf("\tVetor Sem Repetidos -> %s\n\n\n",vetor);
}
int main(){
    char vet[30];
    strcpy(vet,"1,12,12,0,5,67,12");
    verificaRep(vet,40);
    getch();
    printf("\n\n\n");
    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

Olá!

 

@Thayron Oliveira

while (vetor[i] != ',') {
        comp1[j] = vetor[i]; // armazena o estado a ser comparado
        ++j;
        ++i;
        ++tam1;
}

Note que se depois de uma vírgula exitem valores diferentes de vírgula o procedimento continua ... Ou seja, como em C não há maneiras para impedir, nativamente, acesso violado a memória o procedimento pode ir além do limite reservado para o objeto vetor na memória. Compromete-se a segurança, os resultados e, por conta disso, caracterizando um erro lógico. 

 

 

Ainda veja como @devair1010 resolve esse erro ...

while (vetor[i] != ',') {
	if (vetor[i] == '\0') break;
	val[k]=vetor[i];
	++i;
	++k;
}

Note que se depois de uma vírgula existem valores diferentes de vírgula o procedimento continua ... Exceto se é '\0' (ou zero), daí a estrutura de repetição while é interrompida. E o tamanho do vetor copiado é o seu índice, dispensando outra variável de mesmo proposito.

 

 

No geral,@Thayron Oliveira , acredito que o teu método não seja o melhor ainda para o problema. Se você estive aberto a sugestões o que eu faria é copiar ou sobrescrever: Nele você realiza buscas dos itens da string em copia, se o resultado for negativo adiciona o item na copia, isso continua até que o limite ('\0') de string apareça em seu índice. Já em sobrescrever; vai-se sobrescrevendo toda a string a partir do item repetido jogando sobre ele todo conteúdo que vem posteriormente.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...