|
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.
-
29/10/2010 11:07:17 | Bruno Crivelari Sanches - re:

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+
-
20/11/2011 10:01:03 |177.19.3.xxx| Júnior, D. Eskelsen, - Parabéns

(...)
É muito bom ter pessoas que compartilham o
conhecimento ajudando toda a galera que
está em algum furdunço nas linhas de código.
Abraços
-
25/11/2011 08:25:22 |89.152.216.xxx| ts - ajuda

ola, queria imprimir uma string ao contrario, do genero o utilizador escreve ola e na tela aparece alo. agradecia uma resposta
-
07/12/2011 14:45:33 |89.152.216.xxx| tiagusilva - ajuda

ola, queria saber como se faz um programa em c.
uma piramide assim:
1
121
12321
1234321
123454321aguardo uma resposta urgente
-
07/12/2011 15:26:57 | Vinícius Godoy de Mendonça

Isso cabe à você estudar. Não fazemos lição de casa. Principalmente as urgentes.
-
01/02/2012 10:54:49 |79.169.42.xxx| Anônimo

queria saber qual é o codigo c++ para determinar o comprimento de um string de um arry
-
01/02/2012 10:59:50 | Bruno Crivelari Sanches

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+
-
01/02/2012 11:27:11 |79.169.42.xxx| lucy correia

queria saber qual é o codigo c++ para determinar o comprimento do string de um array?
-
01/02/2012 11:28:16 | Bruno Crivelari Sanches

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+
-
08/04/2012 08:56:57 |189.1.128.xxx| Bolado - PESSOAL ME AJUDEM POR FAVOR!!!

Galera!! sou novato em C, me ajudem ae... em uma string como faço para saber quantos pares de ss e rr existem...
-
08/04/2012 10:21:12 | Vinícius Godoy de Mendonça

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

-
05/05/2012 18:26:21 |189.10.39.xxx| Matheus

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?











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;