Comparar strings em C, Resolvido

Peter V5

Folding Member
Olá, nunca conssegui comparar strings em C com um if, tipo desta maneira:

Código:
#include <stdio.h>
#include <string.h>

main()
{[INDENT]       char x[10], y[10];
gets(x);
gets(y);
if(x == y)[INDENT] printf("São iguais");
[/INDENT]else[INDENT] printf("Não são iguais");
[/INDENT]getchar();
getchar();
[/INDENT]}
Dá sempre que não deu, então tentei fazer eu uma função para isso, fiz:

Código:
#include <stdio.h>
#include <string.h>

int compare(char x[20], char y[20])
{[INDENT]int i;
for(i=0; i<20; i++)
{[INDENT]if(x[i] != y[i])[INDENT]return 0;
[/INDENT]if(x[i] == '\'' && x[i+1] == '0')[INDENT]return 1;
[/INDENT][/INDENT]}
[/INDENT]}

main()
{[INDENT]char x[20], y[20];
int sim;
printf("Insira duas strings\n");
gets(x);
gets(y);
sim = compare(x, y);
if(sim == 1)[INDENT]printf("São iguais\n");
[/INDENT]else[INDENT]printf("Não\n");
[/INDENT]getchar();
getchar();
[/INDENT]}
 
Última edição pelo moderador:
Olá, nunca conssegui comparar strings em C com um if, tipo desta maneira:

#include <stdio.h>
#include <string.h>

Dá sempre que não deu, então tentei fazer eu uma função para isso, fiz:

Não podes comparar assim, pois está a comparar o endereço das variáveis.
Para comparar strings em c podes usar a função strcmp
procura no google como usar e vê se consegues fazer a comparação
 
Já encontraste a solução, agora digere bem o porquê.

Na linguagem C ou C++ as strings não são "objectos de primeira classe", isto é, a linguagem em si não tem strings. O que é possível, é estender a linguagem com conceitos de strings.

A linguagem suporta os tipos básicos int e double, número inteiro e número em vírgula flutuante, com variantes. O tipo char não é senão uma variante do tipo inteiro com menos bits. O padrão do C define que o tipo "int" tem de ter pelo menos 16 bits, e que o tipo "char" tem de ter pelo menos 8.

Além destes tipos básicos, a linguagem suporta ponteiros para estes. Um ponteiro é um número que se refere a uma posição na memória. Também se pode fazer aritmética com endereços de memória, com ponteiros.

Na linguagem C, a convenção para representar uma string é representar como uma sequência de chars consecutivos na memória terminados com o valor zero.

Quando fazes a declaração: char* str = "ABC"; o compilador cria no segmento de dados do programa a sequência 'A', 'B', 'C', '\0', e gera código para que a variável local str passe a ter o endereço do carácter 'A'.
A expressão (str + 1), por exemplo, é um ponteiro para o carácter 'B', e a expressão *(str + 2) significa o carácter apontado por (str + 2), logo 'C', e é equivalente da expressão str[2].

Se eu declarar dois arrays de caracteres como fizeste, haverão duas regiões no segmento de dados não inicializados com espaço para 10 caracteres, e as variáveis que declaraste tomarão cada uma o endereço do primeiro dos caracteres em cada um dos arrays.
Por essa razão, a comparação será sempre falsa, porque por muito que os dois arrays contenham os mesmos caracteres, estes estão em zonas diferentes da memória.

Toda essa família de funções strcpy, strcat, strcmp, strchr, strstr, strtok, etc, trabalha com ponteiros para sequências de caracteres terminadas pelo carácter '\0'.

Estuda e compreende agora o código da função strcmp:

Código:
int strcmp(const char* s1, const char* s2)
{
  for ( ; *s1 == *s2; ++s1, ++s2) {
    if (*s1 == '\0') {
      return 0;
    }
  }
  if (*s1 < *s2) {
    return -1;
  }
  else {
    return +1;
  }
}

- O ciclo for executa enquanto a condição *s1 == *s2 for verdadeira, o que significa enquanto os caracteres apontados por s1 e por s2 respectivamente forem iguais.
- Se são iguais, verifica se chegámos ao carácter '\0' que significa que as strings acabam ali, não devemos continuar a percorrer a memória, as strings são iguais e retornamos 0.
- Se não chegámos ao carácter '\0', então faz cada um dos ponteiros s1 e s2 apontar para o carácter que vem a seguir na memória.
- Se o ciclo termina porque *s1 já não é igual a *s2, então retorna -1 ou +1 consoante o primeiro carácter que difere nas strings ser menor na string 1 ou maior.

Recomendo os livros, "The C Standard Library" de P. J. Plauger (presidente do comité de standardização da biblioteca do C), ou, aquele que leva estas questões mais a fundo, "The C Companion" de Allen Holub.

Depois de perceberes o que se passa "under-the-hood", passa para o C++.
 
Back
Topo