NWY Posted August 3, 2006 at 05:57 PM Report #42004 Posted August 3, 2006 at 05:57 PM 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.
Warrior Posted August 3, 2006 at 06:03 PM Report #42005 Posted August 3, 2006 at 06:03 PM 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; }
KTachyon Posted August 3, 2006 at 06:15 PM Report #42010 Posted August 3, 2006 at 06:15 PM 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
Warrior Posted August 3, 2006 at 06:27 PM Report #42015 Posted August 3, 2006 at 06:27 PM 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)
NWY Posted August 3, 2006 at 09:04 PM Author Report #42069 Posted August 3, 2006 at 09:04 PM bem obrigado... 😛
HuTcH Posted August 6, 2006 at 02:30 PM Report #42623 Posted August 6, 2006 at 02:30 PM 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
KTachyon Posted August 6, 2006 at 04:32 PM Report #42651 Posted August 6, 2006 at 04:32 PM 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
HuTcH Posted August 6, 2006 at 04:54 PM Report #42652 Posted August 6, 2006 at 04:54 PM 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 [ ]
KTachyon Posted August 6, 2006 at 05:10 PM Report #42655 Posted August 6, 2006 at 05:10 PM 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
Warrior Posted August 10, 2006 at 09:30 PM Report #43659 Posted August 10, 2006 at 09:30 PM 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)
TheDark Posted August 11, 2006 at 01:22 AM Report #43684 Posted August 11, 2006 at 01:22 AM 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.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now