• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Gurzi

devolve endereço de memoria e chars sguintes

6 mensagens neste tópico

Implemente a função *strchr(char *s,char ch)

que devolve o endereço da primeira ocorrência de ch em s, caso nao existe devolve NULL(substituí eu por um texto de erro).

Nota:(O endereço não é o índice)...

Escreva ainda um programa que solicite uma string e um caractér e mostre no ecrâ os caracteres da string original que se encontram a partir do caractér lido(inclusive)..

Bem este exercicio é do Luis Damas e eu decidi resolver de forma diferente fazendo uma funçao que fize-sse isto tudo..

Está a funcionar, queria opiniões de formas de melhor lógica, de reduzir código para ir aprendendo..

Outro problema é que quando ele mostra os caracteres da string asseguir no fim aparece sempre : Caracter seguinte -> "NADA" 1 vez..

do genero..

Introduza uma string: "tiago"

introduza o caracter : 't'

encontraxe o caracter t na x posicao de memoria

proximo caracter -> i

proximo caracter ->a

proximo caracter ->g

proximo caracter -> o

proximo caracter ->

aparece em branco o ultimo why ? como resolver..?

o meu code..

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

char *strchr(char *s, char ch)
{
  char *ptr=s;
   while(1)
   {
     if (*ptr==ch)
     {
     *++s;
     while (*s!='\0')
     {
     
     printf("Os caracter seguintes sao -> %c\n",*s++);
     
     }
  return ptr;
   }
     else
 {
 while(*ptr !='\0')
   *ptr++;
     printf("caracter inexistente");
     getchar();
     exit(0);
     
     }
}

}

   


main()
{
char s[40];
char ch;



printf("Introduza Uma string\n");
fgets(s,40,stdin);
printf("Introduza o caracter que pretende encontrar\n");
ch=getchar();
fflush(stdin);
printf("o caracter %c foi detectado em %d",ch,strchr(s,ch));
putchar('\n');
system("PAUSE");

}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A função fgets inclui o \n na string. Quando colocas a palara tiago e depois entre, fica na string: tiago\n\0.

Para evitar isto, põe o \0 antes.

Depois tens aqui um warning:

printf("o caracter %c foi detectado em %d",ch,strchr(s,ch));

warning C4313: 'printf'  : '%d' in format string conflicts with argument 2 of type 'char *'

A função strchr devolve um *char

char *strchr(char *s, char ch)

E

*++s;
e
*ptr++;

Acho que o que tu queres é

++s;
e
ptr++;

Mas agora não tenho muito tempo...

Sobre a optimização, não sei, só passei por aqui, depois com tempo vejo isso melhor.

Cumpr. brink@ero :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E

*++s;
e
*ptr++;

Acho que o que tu queres é

++s;
e
ptr++;

Confirmado, o * não faz nada aí!

Sobre o programa, ainda não faz a sua funcionalidade, ainda tens uns bugs.

Cumpr. brink@ero  :smoke:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Quando chegar a casa dou uma vista de olhos, o geshi colocou os { } e a identação toda nos sitios errados e ja troquei os olhos para tentar ler o codigo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Testei o teu programa, e só encontra se ele tiver na primeira posição.

Como eu resolveria:

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

char *strchrm(char *s, char ch) {
     char *pts;
     for (pts=s;*pts!='\n' && *pts!=ch;pts++)
         ;
     if (*pts=='\n') {
        printf("Caracter inexistente\n");
        system("pause");
        exit(0);
     }
     else {
          for (s=pts,pts++;*pts!='\n';pts++) printf("Caracter seguinte: %c\n",*pts);
          return s;          
     }
}

int main() {
    char s[40];
    char ch;
    printf("Introduza Uma string\n");
    fgets(s,40,stdin);
    printf("Introduza o caracter que pretende encontrar\n");
    ch=getchar();
    printf("O caracter %c foi detectado em %ld\n",ch,(long)strchrm(s,ch));
    system("PAUSE");
    return 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora