Pessoal nao é linguagem java mais tem algo a ver.
Nao estou entendendo direito o teste booleano do loop
int strcmp (char *str1, char *str2) { // Estou com dúvida aqui
while (*str1==*str2 && *str1 && *str2) {
str1++;
str2++;
}
return *str1 - *str2;
}
Enquanto o caractere *str1 for igual ao caractere *str2, e enquanto o caractere *str1 for diferente de zero, e enquanto o caractere *str2 for diferente de zero, fazer: {
// …
}
int strcmp (char *str1, char *str2) { // Estou com dúvida aqui
while (*str1==*str2 && *str1 && *str2) {
str1++;
str2++;
}
return *str1 - *str2;
}
Ola, como vai?
Entao espero que possa te ajudar.
Primeiro teu subprograma tem que retornar um valor inteiro. voce esta recebendo como parametro duas strings
sugiro que mude o nome do subprograma de strcmp para outro. strcmp no C é como se fosse o equals no java serve para comparar duas strings
sua comparacao esta errada o correto é (strcmp(str1,str2)!=1) // ou diferente de zero depende se voce quiser que seja verdadeiro ou falso
voce nao pode somar string
(str1++)
para retornar o valor crie duas variaves auxliares. o uso do “*” eh somente para entrar como parametro
entao ficaria assim
enquanto str1 for igual str2
auxiliar1++;
auxiliar2++;
ai retorne o valor.
espero ter ajudado.
interessante essa função: pensei que ela não ia funcionar…
coloquei um (!) no return e ta funcionando normal
[code]#include <stdio.h>
int strcmp (char *str1, char *str2) { // Estou com dúvida aqui
while (*str1==*str2 && *str1 && *str2) {
str1++;
str2++;
}
return !(*str1 - *str2);
}
main(){
printf("%i",strcmp(“identica”,“identica”)); //retorna 1(true)
printf("%i",strcmp(“douglas”,“diferente”)); //retorna 0(false)
}
[/code]
Primeiro vamos explicar algumas coisas;
- No C, 0 é false, todo o resto é true.
- Toda String termina com o valor 0;
- A classe String não existe. O que existe é um ponteiro para o primeiro caracter de uma sequência;
- Você pode somar ponteiros. O que isso faz é adicionar ao endereço de memória o número de bytes correspondente ao tipo de dados do ponteiro.
Como str1 é um ponteiro para um char, somar 1 irá adicionar ao ponteiro o tamanho de um char (no caso 1 byte), deslocando para o próximo caracter da string.
Agora, vemos como funciona esse while:
*str1==*str2 --> Aqui que aqui não tem dúvida. Estou pegando o caracter apontado pelo ponteiro str1, e comparando com o caracter apontado pelo ponteiro str2.
*str1 --> Aqui usa-se um truque. Como a string é terminada com um caractere de valor 0, qualquer valor que o ponteiro aponte diferente disso é verdadeiro, e o while continua. Quando o while chegar ao caractere final da string, o valor será 0, e o while para.
*str2 --> A mesma coisa aqui.
Portanto, essa expressão é o mesmo que:
A soma dentro do while simplesmente pede para o c++ avançar para o próximo caracter.
Finalmente, temos o return. Esse return usa outro artifício.
Essa subtração só retorna 0, caso os dois caracteres sejam também o valor 0.
*str1 - *str2
Como 0 é false, e essa é a condição das strings serem iguais, negamos o valor no return.
Caso os caracteres sejam diferentes (que é a condição de parada do while), a subtração retornará um número positivo ou negativo. Isso, para todos os efeitos, é verdadeiro. E, ao ser negado, faz o método retornar false.
augustosilverio ,
o código esta correto o professor quer que entendemos como funciona o metodo strcmp, eu nao estou entendendo o teste booleano
se vc comparar diego com diogo pelo que entendi no while (*str1==*str2 && *str1 && *str2) ele vai comparar ate o di e depois disso ele vai comparar o ‘o’ com ´e’ e sair do loop pq vai retornar true. entao esse método deveria comparar toda array de char diego com a outra array de char diogo
Certo ViniGodoy, estou começando a entender
Tem que lembrar que uma string assim:
char* x = “Vinicius”;
É, na verdade, um conjunto de valores numéricos, de acordo com a Tabela Ascii, terminado por 0, para indicar que a String acabou.
Ou seja é o mesmo que:
char* x = {86, 105, 110, 105, 99, 105, 117, 115, 0};
E também é importante lembrar que no C, 0 representa FALSE. Qualquer outro número representa TRUE.
Vini deixa eu te perguntar essa função é a implementação nativa do C ou alguma biblioteca nativa?
se for…eu uso code::blocks como eu consigo ver estas implementações? ou algum documento…
Consegui achar as libs, dentro da glibc, não é a libc mais ja ta ótimo…
Certo desculpem a confusão agora entendi o que ele queria.
Não sei.
O C possui algumas implementações da biblioteca padrão. No caso, o Code::Blocks utiliza a implementação feita pelo MinGW, que é uma implementação para Windows do compilador baseado no GNU C++ do Linux.
Você pode baixar os fontes de todas as libs do MinGW no site:
http://sourceforge.net/projects/mingw/files_beta/
O DevCpp usa o mesmo compilador, embora seja uma versão velha e cheirando a mofo e, por isso, não recomendo ninguém a usá-la. Aliás, usar o próprio Dev é uma péssima idéia, uma vez que a IDE tem bugs críticos.
Algumas IDEs, como o Borland e o Visual, não disponibilizam o código fonte das implementações padrão.