Jump to content

Recommended Posts

Posted

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.

Posted

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

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.

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Posted

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)

Posted

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

Posted

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

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Posted

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

Posted

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.

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Posted

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)

Posted

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

Desaparecido.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.