Linguagem C

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;

  1. No C, 0 é false, todo o resto é true.
  2. Toda String termina com o valor 0;
  3. A classe String não existe. O que existe é um ponteiro para o primeiro caracter de uma sequência;
  4. 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.