viciado Postado Dezembro 14, 2008 Denunciar Share Postado Dezembro 14, 2008 retornar 0 se duas strings forem iguais, caso contrario retorna o índice do primeiro caractere não coincidenteComo eu retorno o indice do caractere ?#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char str1[30]; char str2[30]; printf("Digite uma string \n"); fgets(str1, 30, stdin); printf("Digite outra string \n"); fgets(str2, 30, stdin); system("PAUSE"); return 0; } int verifica(char str1[30], char str2 [30]){ if(strcmp(str1,str2)){ return(0); } else{ return Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 jth. Postado Dezembro 14, 2008 Denunciar Share Postado Dezembro 14, 2008 (editado) Cara, eu ainda não estudei strings e não conheço as funções de maniputação de strings muito bem. Mas o que deu a entender é que ele quer que você faça sua própria função para comparar duas strings, verificando a igualdade caractere por caractere... Algo tipo um laço que vá comparando os caracteres um por um e se eles forem diferentes retorna o indice daquele caractere, se não retorna zero mesmo.Até mais, ;D Editado Dezembro 14, 2008 por jth. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 viciado Postado Dezembro 14, 2008 Autor Denunciar Share Postado Dezembro 14, 2008 essa função strcmp() verifica se são iguais, agora caso não sejam como posso retornar o indice do primeiro caractere diferente Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Beraldo Postado Dezembro 14, 2008 Denunciar Share Postado Dezembro 14, 2008 use um loop que percorra as duas strings e compare os caracteresQuando str1 != str2, retorne "i" Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 jth. Postado Dezembro 14, 2008 Denunciar Share Postado Dezembro 14, 2008 (editado) Cara... eu fiz aqui do meu jeito, usando só o sizeof mesmo... não sei se tá certo:int func1(char *v, char *m) { int size,i; if (sizeof v >= sizeof m) size = sizeof m; else size = sizeof v; for(i=0;i<size;i++) if (v[i] != m[i]) { return i; } return 0; }Edição 2ª: Aff... é bem minha 2ª ou 3ª edição. Fiz novos testes, tem um erro... (tentando reparar)]Edição 3ª: É, parece que tenho que estudar mais ponteiros... quando uso o sizeof v ele não remete ao tamanho da string mesmo... aqui fica só retornando valor 4... Obs.: Se você não conhece o "sizeof" ele retorna o tamanho de uma varável ou um vetor em bytes. Como uma string é uma cadeira de "chars" (cada char pesa 1 byte) então eu usei ele para saber a "quantidade de elementos" da string. Editado Dezembro 14, 2008 por jth. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Beraldo Postado Dezembro 15, 2008 Denunciar Share Postado Dezembro 15, 2008 (editado) Obs.: Se você não conhece o "sizeof" ele retorna o tamanho de uma varável ou um vetor em bytes. Como uma string é uma cadeira de "chars" (cada char pesa 1 byte) então eu usei ele para saber a "quantidade de elementos" da string.Não é bem assim.sizeof() retorna o tamanho de um objeto em bytes, mas uma string sempre ocupa um bute a mais por causa do '\ 0'.Teste:#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *din_str, str[] = "teste"; printf("sizeof(str)=%d\nstrlen(str)=%d\n", sizeof(str), strlen(str)); return 0; } Saída:sizeof(str)=6 strlen(str)=5 Por isso existe strlen(). ;) Lembrando que sizeof() só vai retornar o tamanho de um objeto aloca dinamicamente se a memória já estiver alocada. Você se lembrarão disso quando usarem ponteiros dentro de estruturas. ;) O programa em si é mais ou menos assim: int main() { char str1[] = "teste", str2[] = "testa"; int i; for (i = 0; i < 5; i++) { if (str1[i] != str2[i]) { printf("É diferente a partir da posição %d\n", i); break; } } return 0; }Coloquei um for que vai até 5 só para exemplificar, pois usei strings de 5 caracteres. O correto é ir até o tamanho da menor string, para não acessar memória errada. Editado Dezembro 15, 2008 por Beraldo Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 jth. Postado Dezembro 15, 2008 Denunciar Share Postado Dezembro 15, 2008 (editado) Não é bem assim.sizeof() retorna o tamanho de um objeto em bytes, mas uma string sempre ocupa um bute a mais por causa do '\ 0'.Sim, Beraldo, eu tinha me ligado do "\ O"... tanto que usei "i<size" e não "i<=size"...Coloquei um for que vai até 5 só para exemplificar, pois usei strings de 5 caracteres. O correto é ir até o tamanho da menor string, para não acessar memória errada.Toda a minha preocupação com o sizeof é por causa disso...Não conhecia o strlen, na verdade ainda não estudei strings nem suas funções de verdade... o meu código atualizado ficou assim:int func1(char *v, char *m) { int size,i; if (strlen(v) > strlen(m)) size = strlen(m); else size = strlen(v); for(i=0;i<=size;i++) if (v[i] != m[i]) { return i; } return 0; }O código verifica inclusive no índice da string em que existe o "\ O" na tentativa de ver se as strings não são iguais... acho que assim ficou OK...Mas ainda testando isso fiquei confuso. porque não posso usar o sizeof com os ponteiros? Fica retornando 4 sempre... Editado Dezembro 15, 2008 por jth. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Beraldo Postado Dezembro 15, 2008 Denunciar Share Postado Dezembro 15, 2008 Mas ainda testando isso fiquei confuso. porque não posso usar o sizeof com os ponteiros? Fica retornando 4 sempre...Como você está fazendo? Um ponteiro, por padrão, não tem memória alocada. Para que sizeof() retorne o tamanho certo, tem que alocar memória com malloc. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 jth. Postado Dezembro 15, 2008 Denunciar Share Postado Dezembro 15, 2008 (editado) int func1(char *v, char *m) Até onde eu sei, quando eu faço isso estou criando dois ponteiros, v e m para serem usados dentro dessa função, que no caso vão apontar para o índice zero de dois vetores (as strings) que a função receberá como argumento. Quando eu uso "v" e "m" dentro desse meu bloco ele simplesmente deveria apontar para os vetores originais, não? Só que nos meus testes, quando eu uso sizeof(v), por exemplo, ele não retorna o tamanho em bytes do vetor para o qual o ponteiro "v" está apontando, mas sim o valor 4... O que eu teria que fazer para ele retornar o tamanho do vetor "original"? Eis um exemplo do mesmo problema: int main() { char t[]="Testando...",*p; printf("sizeof(%s):%d sizeof(p):%d \n",t,sizeof(t),sizeof(p)); p = t; printf("sizeof(%s):%d sizeof(%s):%d \n",t,sizeof(t),p,sizeof(p)); /* Repare que mesmo depois de atribuir um valor à "p", sizeof(p) continua voltando '4'. * Minha dúvida esta aí... */ }Até mais ;D Editado Dezembro 15, 2008 por jth. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Beraldo Postado Dezembro 15, 2008 Denunciar Share Postado Dezembro 15, 2008 p é apenas um ponteiro. Ele contém um endereço de memória, representado por um long unsigned int.Em máquinas de 32 bits, isso vale 4. A minha é de 64 bits e aparece sempre 8.Com um ponteiro com memória própriua é diferente:int main() { char *p = (char *) malloc(8 * sizeof(char)); strcpy(p, "Beraldo"); printf("p=%s\nsizeof(p)=%lu\nstrlen(p)=%d", p, sizeof(p), strlen(p)); free(p); return 0; }Saída:p=Beraldosizeof(p)=8strlen(p)=7 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 viciado Postado Dezembro 15, 2008 Autor Denunciar Share Postado Dezembro 15, 2008 Tentei assim mais está retornando sempre 0#include <stdio.h> #include <stdlib.h> #include <string.h> int verifica(char str1[30], char str2 [30]); int main() { char str1[30]; char str2[30]; printf("Digite uma string \n"); fgets(str1, 30, stdin); printf("Digite outra string \n"); fgets(str2, 30, stdin); printf("\n %d \n",verifica(str1,str2)); system("PAUSE"); return 0; } int verifica(char str1[30], char str2 [30]){ int i; if(strcmp(str1,str2)){ return(0); } else{ for(i=0;i<30;i++){ if(!strncmp(str1[i], str2[i], 30)){ return (i); } } } } Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Beraldo Postado Dezembro 15, 2008 Denunciar Share Postado Dezembro 15, 2008 strcmp() só aceita dois parâmetros e só trabalha com strings. Para comparar caracteres, use o operador != Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 viciado Postado Dezembro 15, 2008 Autor Denunciar Share Postado Dezembro 15, 2008 Continua retornando sempre 0#include <stdio.h> #include <stdlib.h> #include <string.h> int verifica(char str1[30], char str2 [30]); int main() { char str1[30]; char str2[30]; printf("Digite uma string \n"); fgets(str1, 30, stdin); printf("Digite outra string \n"); fgets(str2, 30, stdin); printf("\n %d \n",verifica(str1,str2)); system("PAUSE"); return 0; } int verifica(char str1[30], char str2 [30]){ int i; if(strcmp(str1,str2)){ return(0); } else{ for(i=0;i<30;i++){ if(str1[i] != str2[i]){ return (i); } } } } Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Beraldo Postado Dezembro 15, 2008 Denunciar Share Postado Dezembro 15, 2008 (editado) Return ValueReturns an integral value indicating the relationship between the strings:A zero value indicates that both strings are equal.A value greater than zero indicates that the first character that does not match has a greater value in str1 than in str2; And a value less than zero indicates the opposite.Fonte: http://www.cplusplus.com/reference/clibrar...ing/strcmp.htmlLogo: if(strcmp(str1,str2)== o){ Editado Dezembro 15, 2008 por Beraldo Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 viciado Postado Dezembro 15, 2008 Autor Denunciar Share Postado Dezembro 15, 2008 Obrigado. Resolvido Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
viciado
retornar 0 se duas strings forem iguais, caso contrario retorna o índice do primeiro caractere não coincidente
Como eu retorno o indice do caractere ?
Link para o comentário
Compartilhar em outros sites
14 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.