Ir para conteúdo
lord_shy

Problema em manipulação de strings e ponteiros

Recommended Posts

Eu estive fazendo um programa em C que lia a string1 e apagava a primeira ocorrência da string2. Na string1:"O Rato Roeu a Roupa" se eu colocar "Ra" na string2, o programa apaga corretamente, sem erros. Mas se eu colocar "Ro" na string2, ele dá erro e fecha.


Segue abaixo o código comentado:

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

char *StrDelStr(char *s1, char *s2);//essa função deve apagar a primeira ocorrencia de s2 em s1

int main(void)
{
char string1[60], string2[30];

printf("digite uma string\n> "); gets(string1); fflush(stdin); //pega a primeira string
printf("digite uma outra string menor\n> "); gets(string2); fflush(stdin); //pega a segunda string
printf("\nstring ja transformada\n> %s\n", StrDelStr(string1, string2));

return 0;
}

char *StrDelStr(char *s1, char *s2)
{
int ocorrencia, i, j, tamanho_s2=strlen(s2), concordancia_s1_s2;
char *ptr1=s1, *ptr2=s2; //*ptr1 vai ser equivalente a s1 e *ptr2 vai ser equivalente a s2

for(ocorrencia=i=j=concordancia_s1_s2=0;*ptr1!='\0';*ptr1++, ptr2=s2)//ao invés de usar o s1[i]!='\0' eu usei o *ptr1!='0' para percorrer a
{                                                                    //string, pq depois tenho que apagar os caracteres e o ptr2 é sempre zerado
    if(ocorrencia==0&&*ptr1==*ptr2)//aqui verifica se eu já apaguei algo antes e se *ptr1 é igual a *ptr2 
    {
        while(*ptr1==*ptr2)//se o if for atendido vai inciar o while com a condição de *ptr1==*ptr2
        {
            j++; //o j vai ser adicionado
            concordancia_s1_s2++; //tanto como o inteiro concordancia_s1_s2
            *ptr1++; *ptr2++; //aqui os ponteiros avançam uma posição char
        }
        if(concordancia_s1_s2==tamanho_s2) //quando o while for quebrado, esse if verifica se o concordancia_s1_s2 é igual ao tamnho de s2
            ocorrencia++; //se for, ocorrencia é adicionado impedindo o acesso à esse if
        else
            ptr1-=j; //caso não seja do mesmo temaznho, significa que não era s2 por completo dentro de s1, logo, *ptr regride
    }                //à posição que estava antes de entrar nesse if

    s1[i++]=*ptr1;//*ptr é escrito em i, que logo depois é adicionado
}
s1[i]='\0'; //após tudo, é colocado um delimitador no final da string

return s1; //e s1 é retornado
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

O seu código tem erro e não funciona. Aqui vai um código feito por mim que remove uma substring de uma string: 

 

void deleta_string(char *str1, char *str2, char *str3){
  char *ptr1,*ptr2,*ptr3;  
  int tam,count;
  tam = strlen(str2);     
  ptr1=str1;
  ptr2=strstr(str1,str2);
  ptr3=str3;
  while(1){
    *ptr3=*ptr1;    
    ptr3++;
    ptr1++;
    if(ptr1==ptr2)
      break;          
  }  
  count=1;
  while(count<=tam){    
    ptr1++;
    count++;
  }
  while(*ptr1!='\0'){
    *ptr3=*ptr1;
    ptr3++;
    ptr1++;    
  }  
  *ptr3='\0';                  
}

int main(){
  char str1[40]="O rato roeu a roupa do rei de roma.", str2[40]="roeu",str3[40];
  deleta_string(str1,str2,str3);
  printf("\n%s",str3);
  system ("pause");    
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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

  • Conteúdo Similar

    • Por Jehlemos
      Olá,
      Boa Tarde!
      Estou em uma plataforma de estudos no qual se executa exercícios e testes, o enunciado é:
       
      Escreva a função pode SeAposentar que recebe por parâmetro a idade, o sexo e os anos de contribuição previdenciária que uma pessoa tem, exemplo: podeSeAposentar(62, "F", 34) true.
      A idade mínima para se aposentar para mulheres é 60 anos, enquanto que para homens é 65. Em ambos os casos, deve ter pelo menos 30 anos de contribuição.
       
      function podeSeAposentar (idade, sexo, anosTrabalhados) { if(anosTrabalhados >= 40) { if(sexo == "F") { if(idade >= 60) { return true; } } else if(sexo == "M") { if(idade>= 65){ return true; } } } return false; }
      >
      Sua solução funcionou, mas aponta o seguinte erro:
      Objetivos que não foram atendidos: podeSeAposentar faz comparações contra strings.
       
      **O que está errado? Alguém pode me ajudar?** 
      Obrigada!
    • Por jeredy
      Tenho um trabalho da faculdade e não consigo fazer rodar o programa corretamente.
      Quando eu coloco o cpf, na hora de imprimir sai um número aleatório. Creio que possa ser por falta de memória pois se coloco um número menor ele sai certo, porém não consigo adicionar memória em cpf.
       
      Obs: ainda não fiz a parte dos menores e da medial do grupo e a parte de imprimir em tabela pois não consegui fazer funcionar nem um básico mas se alguém souber essa parte também e puder me ajudar agradeço!!
       
      #include <stdio.h> #include <stdlib.h> main(){ struct funcionarios{ int *cpf; char nome[30]; int nascimento; float salario; }; int aux=0; //para testar se for 0 antes de armazenar o cpf struct funcionarios *func; int qtdLeitura=0, i=0, cont=0; func = ((struct funcionarios *) (malloc(sizeof(struct funcionarios) * 1))); while(1){ printf("Digite o cpf %d: ", i+1); scanf("%d", &aux); if(aux!= 0){ func.cpf = aux; fflush(stdin); } else{ break; } if(func != NULL){ qtdLeitura++; func = ((struct funcionarios *) realloc(func, sizeof(struct funcionarios) *(qtdLeitura+1))); } printf("Digite o nome %d: ", i+1); scanf("%s", func.nome); printf("Digite o nascimento %d: ",i+1); scanf("%d", &func.nascimento); printf("Digite o salario %d: ",i+1); scanf("%f", &func.salario); cont++; i++; } printf("\n\n"); for(i=0;i<cont;i++){ printf("Cpf %d:%d \n",i+1, func.cpf); printf("Nome %d: %s\n",i+1, func.nome); printf("Nascimento %d: %d\n",i+1, func.nascimento); printf("Salario %d: %.2f\n",i+1, func.salario); } }
       

    • Por MAKAVELIQUE
      Saudações, criei meu perfil hoje, sou iniciante neste mundo da programação, alguém poderia me ajudar a compreender isso? é um código em javascript que eu estou escrevendo,    variáveis b1, b2, b3 e c1, c2 e c3 recebem valores parecidos com estes, contudo,   parece que os if´s não estão fazendo as devidas verificações pra abrir o document.write de acordo com cada condição...
      <script> function teste() {     img1.src = "foto.png";                b1="J";// esses valores podem variar...     c1="C";// esses valores podem variar...     b2="J";// esses valores podem variar...     c2="C";// esses valores podem variar...     b3="J";// esses valores podem variar...     c3="C";// esses valores podem variar...     if(b1 == c1 && b1 == b3){//daqui pra baixo parece que não funciona...     if(c1==c2 && c2==c3){                 document.write ("1");     }         if(c1!=c2 && c2 != c3 && c1!= c3){     document.write ("2"); }          if(c1== c2 && c1 != c3 or c2 == c3 && c2 != c1 or c1== c3 && c2 != c1 ){       document.write ("3"); } } } </script> <a href="#" onClick="teste();"><img style="position:absolute; left:20px; top:275px; " src="imagem.gif" name="img1"/></a>  
      <script> //Observação: assim funciona:  function teste() { img1.src = "foto.png";  } </script> <a href="#" onClick="teste();"><img style="position:absolute; left:20px; top:275px; " src="imagem.gif" name="img1"/></a>  
    • Por leonardo021970
      Olá, preciso de ajuda !
      Eu tenho uma variavel com conteudo html de um site PORÉM eu preciso pegar apenas o seguinte pedaço dele
       
      <h1 class="entry-title"><a href="CONTEUDO QUE EU QUERO E VARIA SEMPRE" rel="bookmark">
       
      Alguem sabe como fazer isso?
    • Por leonardo021970
      Olá, preciso de ajuda !
      Eu tenho uma variavel com conteudo html de um site PORÉM eu preciso pegar apenas o seguinte pedaço dele
       
      <h1 class="entry-title"><a href="CONTEUDO QUE EU QUERO E VARIA SEMPRE" rel="bookmark">
       
      Alguem sabe como fazer isso?
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.