Ponto V!

Bruno Crivelari Sanches
Strings em CImprimir
Escrito por Bruno Crivelari Sanches

Um item que vejo muitos novatos na linguagem tendo dificuldades são as strings em C, por isso resolvi escrever alguns tutoriais e tentar resolver muitas das duvidas que vejo por ai.

Para começo de conversa strings em C praticamente não existem, o compilador tem apenas uma vaga noção do que é uma string, pois elas são uma convenção onde um vetor de caracteres terminado com 0 (zero) representa uma string. Sendo assim, podemos criar uma string usando:

#include <stdio.h>

int main(int, char **) 
{ 
    char ola[4];

    ola[0] = 'o'; 
    ola[1] = 'l'; 
    ola[2] = 'a'; 
    ola[3] = 0;

    printf(ola);

    return 0; 
} 

Este código simplesmente imprime "ola" na tela, mas note que ao inicializar ola colocamos o caracter '\ 0' (que nada mais é que o numero 0) no final do array, ele é necessário pois é a única forma do printf saber onde termina a string. Agora escrever esse código toda vez que precisarmos criar uma string é bem chato, por isso, uma das poucas coisas que o compilador C sabe sobre strings é:

#include <stdio.h>
  
int main(int, char **) 
{ 
    char ola[] = "ola";

    printf(ola);

    return 0; 
} 

Este código é idêntico ao anterior, mas escrito de uma maneira bem mais simples. Note que o compilador reconhece a string "ola" e declara um array de 4 chars e já inicializa ela com a string "ola" (incluindo o ). Também podemos escrever:

#include <stdio.h>

int main(int, char **) 
{ 
    const char *ola = "ola";

    printf(ola);

    return 0;
} 

Este código já é um pouco diferente do anterior, aqui não criamos um vetor de caracteres, e sim um ponteiro para uma região de memória constante do tipo char, trocando por miúdos, criamos um ponteiro que aponta para string. Mas onde diabos foi parar a string? O compilador alocou um trecho de memória constante na seção de dados do código (uma variável global). Por isso usamos const, pois esta string não deve ser modificada pelo código.

Contando Caracteres

Agora que já sabemos como uma string funciona em C, vamos fazer uma função para contar quantos caracteres uma string tem, assim podemos ver como o 0 no final dela é usado:

#include <stdio.h>

int contaChar(const char *str) 
{ 
    int i = 0;

    for(;str[i] != 0; ++i);

    return i; 
}

int main(int, char **) 
{ 
    char ola[] = "ola";

    printf("A string %s possui %d caracteres\n", ola, contaChar(ola));

    return 0; 
} 

Note que sempre que precisamos saber quantos caracteres uma string possui, precisamos percorrer toda a string, isso pode trazer problemas de performance em algumas aplicações e este problema ocorre com quase todas as operações com string.

Outro detalhe, não é preciso criar a função contaChar, quando precisar saber o tamanho de uma string basta usar a strlen, que é declarada no string.h:

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

int main(int, char **) 
{ 
    char ola[] = "ola";

    printf("A string %s possui %d caracteres\n", ola, strlen(ola));

    return 0; 
} 

Neste mesmo arquivo existem varias outras funções para se trabalhar com strings, é recomendável dar uma olhada na documentação antes de escrever a sua própria função para verificar se ela já não existe (alias, isso é recomendável para qualquer coisa, não apenas strings).

Comparando Strings

Agora chegamos ao ponto onde a maioria tem dificuldades, como saber se uma string é igual a outra? A idéia inicial é escrever:

#include <stdio.h>

int main(int, char **) 
{ 
    char ola[] = "ola"; 
    char ola2[] = "ola";

    if(ola == ola2) 
        printf("Iguais"); 
    else 
       printf("Nao sao iguais");

    return 0; 
} 

Se você entendeu tudo até aqui já deve imaginar qual vai ser a saída do programa acima, se não, tente ler novamente e execute o programa. Muitos ficam surpresos ao ver o programa imprimir "Não são iguais". Isto ocorre porque o if esta na verdade comparando dois ponteiros (lembre-se, arrays sem índice são ponteiros).

Então como fazer para saber se duas strings são iguais? É necessário comparar todos os caracteres das strings:

#include <stdio.h>

bool saoIguais(const char *s1, const char *s2) 
{         
    for(int i = 0;s1[i] == s2[i]; ++i) 
    {                 
        if(s1[i] == 0) 
            return true; 
    } 
    return false; 
}

int main(int, char **) 
{ 
    char ola[] = "ola"; 
    char ola2[] = "ola";

    if(saoIguais(ola, ola2)) 
        printf("Iguais"); 
    else 
        printf("Nao sao iguais");

    return 0; 
} 

Agora já sabemos como identificar se duas strings são iguais ou não, um pouco trabalhoso, mas é o único jeito. Para simplificar um pouco a vida, a biblioteca padrão já vem com uma função de comparação de strings chamada strcmp, que funciona de maneira similar a função saoIguais, a diferença é que essa função não verifica apenas se as duas strings são iguais, ela compara as duas, retornando 0 quando são iguais, -1 quando a primeira string vem antes da segunda, ou 1 caso contrário:

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

int main(int, char **) 
{ 
    char ola[] = "ola"; 
    char ola2[] = "ola";

    if(strcmp(ola, ola2) == 0) 
        printf("Iguais\n"); 
    else if(strcmp(ola, ola2) != 0) 
        printf("Nao sao iguais");

    return 0; 
}

Pronto, agora já temos uma maneira simples de verificar se duas strings são iguais ou não.

No próximo tutorial, vamos dar uma olhada em mais algumas operações com strings em C.


Comentários (22)
  • Gustavo  - struckt
    avatar

    gostaria saber como compara a string em estrutura de dados por exemplo. digamos que eu queria registrar so um tipo de sobre nome por exemplo.

    struckt {

    char nome
    char sobrenome

    } dados;

  • Vinícius Godoy de Mendonça
    avatar

    strcmp(dado1.nome, dado2.nome);

  • Bruno Crivelari Sanches  - re:
    avatar

    Olá Gustavo,

    o processo é o mesmo que o Vinícius citou:

    Vinícius Godoy de Mendonça Escreveu:
    strcmp(dado1.nome, dado2.nome);

    Detalhe que não tem diferença no caso da struct, você os chars como se fosse usar em qualquer outro lugar, mas tem que especificar ele usando o ".".

    Surigo dar uma lida no material básico de C/C++, já viu nosso roadmap:
    Roadmap C++ ??

    T+

  • Felipe Prado  - muito bom esse artigo.
    avatar

    (y)

  • Júnior, D. Eskelsen,  - Parabéns
    avatar

    (...)

    É muito bom ter pessoas que compartilham o
    conhecimento ajudando toda a galera que
    está em algum furdunço nas linhas de código. :lol:

    Abraços

  • ts  - ajuda
    avatar

    ola, queria imprimir uma string ao contrario, do genero o utilizador escreve ola e na tela aparece alo. agradecia uma resposta

  • Bruno Crivelari Sanches
    avatar

    Ok, mas qual sua dúvida?

  • tiagusilva  - ajuda
    avatar

    ola, queria saber como se faz um programa em c.
    uma piramide assim:
    1
    121
    12321
    1234321
    123454321

    aguardo uma resposta urgente

  • Vinícius Godoy de Mendonça
    avatar

    Use 2 fors.

  • tiagusilva
    avatar

    como?

  • Vinícius Godoy de Mendonça
    avatar

    Isso cabe à você estudar. Não fazemos lição de casa. Principalmente as urgentes. ;)

  • Anônimo
    avatar

    queria saber qual é o codigo c++ para determinar o comprimento de um string de um arry

  • Bruno Crivelari Sanches
    avatar

    Basta usar função strlen da biblioteca padrão. Não existem diferenças em C++ quanto a strings, a não ser pelo fato que em c++ existe uma classe string na biblioteca padrão que pode e deve ser usada em substituto as strings em C.

    T+

  • lucy correia
    avatar

    queria saber qual é o codigo c++ para determinar o comprimento do string de um array?

  • Bruno Crivelari Sanches
    avatar

    O primeiro sub-tópico do artigo trata exatamente desse problema: "Contando Caracteres", com um código exemplo e ainda menciona o uso de strlen.

    T+

  • Anônimo
    avatar

    obrigado pela ajuda.

  • Bolado  - PESSOAL ME AJUDEM POR FAVOR!!!
    avatar

    :evil: Galera!! sou novato em C, me ajudem ae... em uma string como faço para saber quantos pares de ss e rr existem...

  • Vinícius Godoy de Mendonça
    avatar

    Você usa usa um for e conta. Quebre um pouco a cabeça. Nós não iremos fazer sua lição de casa. ;)

  • Bolado  - Afff!!
    avatar


    Pow!! fato... quebrei a cabeça... vlw

  • Matheus
    avatar

    Como faço pra se caso eu declarar uma string e pedir pro usuario digitar o valor dela ele digitar algo maior que a string, sendo que ele tem que possuir um tamanho fixo. Em outras palavras... Tenho que usar um vetor de tamanho fixo. Tenho que pedir pro usuario entrar com a string e armazena-la. Tentei por ponteiro, mas não consigo restringir o tamanho dela depois, e se for por vetor ele estrapola o valor declarado e dá erro no programa... Não achei outra maneira... Alguma ideia?

  • Bruno Crivelari Sanches
    avatar

    use fgets com stdin: http://www.cplusplus.com/reference/clibrary/cstdio/fgets/

    T+

Escrever um comentário
Your Contact Details:
Gravatar enabled
Comentário:
[b] [i] [u] [url] [quote] [code] [img]   
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch::(:shock:
:X:side::):P:unsure::woohoo::huh::whistle:;):S:!::?::idea::arrow:
Security
Por favor coloque o código anti-spam que você lê na imagem.
LAST_UPDATED2  

Busca

Linguagens

Twitter