Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #57 da revista programar. Faz já o download aqui!

NWY

Dúvida C

Mensagens Recomendadas

NWY    0
NWY

Bem estava eu a treinar C apos umas semanas de não lhe ter tocado (pois é...férias..) e tentei fazer a leitura de uma string ao contrário...e essa é a duvida pois eu n consigo ou tou pelo mau caminho ou estou la perto ou é apenas uma pequena falha...aqui vai o codigo :

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

int stringc(char *str,char a);
main()
{
printf("%d",stringc("bruno",'o'));
}
int stringc(char *str,char a)
{
int x;
for(x=strlen(str);str[x]!='\0';x=x-1)
if(str[x]==a)
return x;
}

o output deveria ser o nº 4 (a 4º posicao da minha char no vector)...n tou a ver onde tou a falhar ...

obrigado pela a atenção e boas ferias pra quem as vai começar ..e pra quem ja as passou...bom trabalho.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Warrior    68
Warrior

Tal como tens, ele nem te chega a entrar no ciclo.

se str="bruno", x=strlen(str) = 5. str[5]='\0', logo, ele sai imediatamente do for, sem nenhuma iteração.

Tens duas soluções para resolver isso, e ambas envolvem alterar o for (ou a inicialização ou a condição)

Iniciar o x a 0, e fazer a pesquisa do inicio para o fim da string:

for (x=0;s[x]!='\0';x++) 

ou fazer a pesquisa do final para o inicio, enquanto não ultrapassares os limites da string

for (x=strlen(str)-1;x>=0;x--)

A que corresponde à abordagem que tu tinhas, é esta segunda.

Deves também incluir um "return -1" no final da função, caso ele não encontre. Pelo menos costuma ser esse o procedimento.

Para não me limitar a responder ao tópico, deixo também uma solução que recorre a apontadores.

int stringc(char *str,char a) {
    char *x=str;
    for (;*str!='\0';str++)
        if (*str==a) return (str-x);
    return -1;
}

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
KhAoTiK TaChYoN    0
KhAoTiK TaChYoN

Não te esqueças de retornar un número caso o método não encontre uma letra igual (por exemplo, retorna -1).

No main, deves indicar o tipo de retorno, de preferência int, retornando um valor no fim (por exemplo, 0), apenas para n aparecerem os Warnings feios que muitos compiladores dão para estarem de acordo com as normas ANSI.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Warrior    68
Warrior

Sem dúvida, as normas dizem que todas as funções devem retornar/ter um tipo de dados, e a main nao é excepção, costumando ser do tipo inteiro e retornar 0. (Normalmente usam-se valores de retorno diferentes de 0 para vários tipos de erros que podem ser tratados por outros programas mais tarde)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HuTcH    0
HuTcH

hi, warrior tens ali uma parte no teu codigo q me deixou um bocado confuso:

 char *x=str;

pelo q estive a ver isso e' o mesmo q fazer:

char *x;
x=str;

da segunda maneira eu percebo o q se esta' a fazer, agora como tu tens, tas a dizer q o conteudo da variavel apontada por x contera' o valor str, ms tu nem inicializaste a variavel x, logo podes estar a guardar isso em sitios q n devias, de certeza q o meu raciocineo esta' a falhar em algum lado ms gostaria de saber onde?

hugs

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HuTcH    0
HuTcH

KhAoTiK TaChYoN n me parece pois qd estas a declarar um apontador o espaco de memoria reservado sera' sempre para um inteiro(4bytes) pois um endereço e' tratado com um inteiro dps o tipo do apontador diz-te qts bytes a partir desse endereço sera' feita a busca, pelo menos e' essa a ideia q tenho, agr n tou a perceber o o porquê da variavel x n ser inicializada.

Outra coisa q tb achei estranho na funcao do warrior foi apos a atribuicao(char *x=str) a variavel x ficar com o valor da variavel str, n deveria ser o conteudo da variavel apontada por x a ficar com o valor de str?

hugs [ ]

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
KhAoTiK TaChYoN    0
KhAoTiK TaChYoN

Ah, n estava a dar atenção, sorry. Está perfeitamente válido. Tens um ponteiro x, que aponta para um char. Metes o ponteiro a aponter para o primeiro char da str (ou para o mm sítio para onde o str aponta). Perfeitamente válido.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Warrior    68
Warrior

Só voltei agora de férias (vou outra vez amanha) mas é exactamente isso.

Quanto à questão do HuTcH: é indiferente percorrer o ciclo usando o str ou o x, uma vez que apontam para o mesmo. (isto fazendo as alterações necessárias)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
TheDark    0
TheDark

Outra coisa q tb achei estranho na funcao do warrior foi apos a atribuicao(char *x=str) a variavel x ficar com o valor da variavel str, n deveria ser o conteudo da variavel apontada por x a ficar com o valor de str?

Estás a confundir a declaração e inicialização da variável x ( char *x=str; ) com a afectação do espaço de memória apontado por x, por desreferenciação ( *x = str; ). No primeiro caso o asterisco serve para dizer que x é um apontador para caracter, e no segundo serve para dizer que o valor da posição de memória apontada por x é alterado.

Não sei se fui claro...

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


×

Aviso Sobre Cookies

Ao usar este site você aceita a nossa Política de Privacidade