Ir ao conteúdo

Posts recomendados

Postado

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
Postado

@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;
}

 

Postado

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

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...