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

NWY

Dúvida C

11 mensagens neste tópico

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Realmente... mas o k falta a alocação de memória, não é a inicialização.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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 [ ]

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

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