Você está na página 1de 8

Tutorial Strings e Caracteres -

Escrevendo em C
Introdução as strings: o que são, como declarar e
inicializar – O Operador \0
 Após nosso estudo sobre vetores e das noções sobre ponteiros, vamos usar esses conhecimentos
obtidos em nosso curso online de C.

Tente achar um programa que não tenha nada escrito. Que não seja necessário ler ou informar
alguma letra ou palavra.
Até nas calculadoras temos que inserir caracteres (+, -, *, % etc).

Essa seção é totalmente dedicada a escrita, suas bibliotecas, funções, funcionamento e detalhes.
Sim, vamos aprender a escrever em C, nesta seção de nossa apostila.

  O que são Strings em linguagem C


Não foi à toa que ensinamos vetores antes de ensinarmos strings.
String é um vetor de caracteres com um delimitador que indica o final da string: \0

Por exemplo, para escrever “ C Progressivo”, seria necessário declararmos 13 caracteres e preenchê-
los um por um, o que, obviamente é inviável, pois daria muito trabalho.
Imagine escrever textos longos com variáveis do tipo char puras.

Para contornar isso, o C trata vetores de caracteres de uma forma muito especial, com certas
‘regalias’, detalhes e opções, em relação aos outros tipos de vetores.

Na verdade, já vínhamos usando strings em nosso curso de C, dentro da função printf.


Podemos diferenciar as strings dos caracteres, porquê as strings aparecem dentro de aspas duplas, e
os caracteres dentro de aspas simples.

“Curso C Progressivo” -> String


“C” -> String
‘C’ -> Caractere

O caractere especial delimitador de


strings: \0
Antes, porém, de ensinarmos a declarar, inicializar e usar strings em C, temos que falar sobre esse
caractere especial: \0

Esse caractere é o 0 do código ASCII (não é o caractere 0, é o elemento de número 0 do código


ASCII), e é o delimitador de final de string.
Ou seja, ele representa o fim de uma string.
Se não tiver o delimitador ao fim de um vetor de caracteres, não é string, é apenas um vetor de
caracteres (sim, são coisas diferentes).

Como declarar e inicializar Strings em


C
Para declarar string em C, não há segredo, pois é a mesma coisa de declarar um vetor de variáveis
do tipo char.

A sintaxe é sempre a seguinte:


char nome_da_string[tamanho];

Aqui, porém, vale uma ressalva muito importante que geralmente os programadores C iniciantes
esquecem: o caractere delimitador - \0 – também fará parte da string.
Ou seja, ele conta no número de caracteres, no tamanho da String.

Por exemplo: “C Progressivo”


Quantos caracteres existem? 13 não é? Mas o número total de caracteres é 14, pois o caractere \0
também vai ‘comer’ uma variável do tipo char.

Então, para declarar uma string que vai armazenar “C Progressivo”, temos que fazer:
char curso_de_C[14];

Logo, sempre que formos declarar uma string, temos que levar em consideração no seu tamanho o
caractere delimitador. No exemplo que demos, temos que declarar uma string que armazene 14
caracteres ou mais.

Como inicializar strings em C


Lembrando que as strings estão entre aspas, podemos ter declarado e inicializado essa string assim:
char curso[14] = “C Progressivo”;

E o caractere delimitador? O C coloca, automaticamente, ao fim da string.


Podemos fazer assim também:
char curso[] = “C Progressivo”;

Que lembra o que fazíamos nos vetores. Desse jeito, o C vai alocar o número exato de caracteres
necessários, que no caso é 14 (13 para nossa frase mais 1 para o \0).

Outra possibilidade de carga automática, onde o C aloca o número certo de caracteres, é através de
ponteiros. Lembra que dissemos que o nome do vetor é,  na verdade, um endereço de memória?
Endereço do primeiro elemento do vetor?
Podemos então inicializar uma string através de um ponteiro para o tipo char:
char *curso = “C Progressivo”;

Quando formos estudar e criar as funções da biblioteca string.h, que nos fornece diversas opções
para trabalhar com strings, vamos usar bastante os conceitos de ponteiros.
Por fim, podemos inicializar as strings da maneira mais ‘trabalhosa’, que é caractere por caractere
onde,
mais uma vez, o C colocar o delimitador de string \0 na última posição:
char curso[14] = {‘C’, ‘ ‘, ‘P’, ‘r’, ‘o’, ‘g’, ‘r’, ‘e’, ‘s’, ‘s’, ‘i’, ‘v’, ’o’};

E se declararmos com um tamanho maior que o texto? Por exemplo:


char curso[2112] = “C Progressivo”;

Da posição 0 até a 12, existirão os caracteres da frase.


Na posição 13,  o C coloca o caractere delimitador, sinalizando o final da string.
E nas outras posições? Lixo.

Exemplo de código: Declarando, Inicializando e Exibindo strings em C


Declare uma string e inicialize. A seguir, exiba essa string na tela.

Vamos declarar uma string de 20 caracteres.


Podemos preencher a string com que caractere quisermos, mas a última posição da string é sempre o
delimitador \0.
O C coloca esse delimitador sempre após o último caractere inserido.

Como nosso vetor tem 20 posições, podemos preencher, no máximo, até a posição 18.

Como usamos somente a frase “C Progressivo”, de 13 caracteres, o caractere \0 será o 14º caractere.
Vamos usar o primeiro laço for para imprimir todos os caracteres da string ‘curso’.
Note que o C imprime todos os caracteres antes do \0, e depois dele, nenhum.

O segundo laço for faz com que nossa variável auxiliar inicie na posição 0 da string e vá até a posição
em que encontra o \0. Quando encontra, o laço para e mostramos em que posição encontrou o
delimitador.

#include <stdio.h>
// Curso C Progressivo: www.cprogessivo.net
// O melhor curso de C! Online e gratuito !
// Artigos, apostilas, tutoriais e vídeo-aulas sobre
// a linguagem de programação C !

int main(void)

{
char curso[20] = "C Progressivo";
int count;

for(count=0 ; count < 20 ; count++)


printf("%c",curso[count]);

for(count=0 ; curso[count] != '\0' ; count++)


;
printf("\nO '\\0' esta na posicao %d da string\n", count);
return 0;

}
Na verdade, existem maneiras bem mais simples de se exibir strings, que você aprenderá no próximo
tutorial de nosso curso online de C.
Decidimos ensinar dessa maneira para você saber o que ocorre por debaixo dos panos, ver o
caractere delimitador atuando de verdade.

Lendo e Escrevendo Strings em C


Que 99,99% dos aplicativos em C, ou de qualquer outra linguagem, usam strings e caracteres para
mostrar textos, nós já convencemos você.

Mas só mostrar não adianta muita coisa, geralmente é preciso receber strings do usuário.
Afinal, quem nunca forneceu o nome pra ficar no ranking daquele jogo, data e local de nascimento,
nome dos pais e outros tipos de texto?

Nesse tutorial sobre strings em C, vamos ensinar como receber textos do usuário.

%s
Antes de iniciar nosso estudo das funções que recebem e lêem strings, vamos apresentar o %s.
Você deve se lembrar que usamos %d para representar números inteiros, %f para números decimais
e %c para caracteres.

Para strings, usamos o %s.

Como ler strings com a função scanf()


Assim como os números e caracteres, também podemos usar a nossa tão conhecida função scanf
para receber uma string do usuário.

Há um porém com a leitura de strings e um problema com a função scanf para strings.

O porém é o seguinte: lembra que repetimos, exaustivamente, que o nome de um vetor nada mais é
que o endereço de memória do primeiro elemento do vetor?
Lembra que dissemos também no tutorial de C passado, sobre a definição de strings, que strings são
um vetor de caracteres com um caractere delimitador \0 no final?
E por fim, lembra que, para armazenar dado em uma variável, na função scanf() nós sempre
passamos o endereço da variável ( &variável)?

Se você conseguiu ver onde chegamos, notará que para receber uma string do usuário através da
funçãoscanf(), não é necessário colocar o operador &, pois o nome da string em si já é um endereço
de memória.

A sintaxe para receber uma string por meio da scanf() é:


scanf(“%s”, nome_da_string);

Exemplo: Programa que pede o nome e sobrenome em C


Crie um aplicativo em C que peça ao usuário seu nome, armazene em uma String, peça o
sobrenome, armazene em outra string e exiba o nome do usuário de maneira formal ( Sobrenome,
Nome).

Criamos duas strings, optamos por colocar 20 caracteres em cada, como temos que ter o caractere
delimitador, então declaramos o vetor de caracteres com 21 elementos cada, um pro nome e outro
pro sobrenome.

Depois pedimos o nome ao usuário, armazenando na variável ‘nome’, e fazemos o mesmo na


variável ‘sobrenome’.
Em seguida, para exibir a string completa, basta usarmos o símbolo %s , da mesma maneira que
vínhamos fazendo com %d, %f e %c na printf()

Veja como ficou o código de nosso programa em C:

#include <stdio.h>
// Curso C Progressivo: www.cprogessivo.net
// O melhor curso de C! Online e gratuito !
// Apostila online, tutorial completo sobre
// a linguagem de programação C !

int main()
{
char nome[21], sobrenome[21];

printf("Primeiro nome: ");


scanf("%s", nome);

printf("Ultimo sobrenome: ");


scanf("%s", sobrenome);

printf("Ola senhor %s, %s. Bem-vindo ao curso C Progressivo.\n",


sobrenome, nome);
return 0;

Vamos agora apontar o problema do uso da função scanf()  receber dados do usuário.


Você deve ter digitado apenas um nome e um sobrenome.

Pois bem, digite um nome composto no ‘nome’ ou no ‘sobrenome’. Ou seja, um nome com espaço em
branco.

A scanf() vai simplesmente cortar seu nome composto. Essa função pega tudo até encontrar um
espaço em branco, caractere new line \n, tab ou ENTER.
Para corrigir isso, o C tem uma função especial e bem mais simples para receber strings do usuário, a
função gets().
Como receber strings do usuário com a
função gets()
gets vem de get string. Como sempre, algo bem óbvio e de fácil memorização.

Para usar a função gets(), é bem simples, basta passar uma string como argumento.
A sintaxe é:
gets( nome_da_string );

Mais uma vez, nunca use & quando for armazenar uma string. Isso não é necessário, pois string é um
vetor, e o nome do vetor já é um endereço, e um endereço é o operador & seguido do nome da
variável.

Como exibir strings com a


função puts() e  printf()
Já que mostramos como obter, facilmente, uma string do usuário a partir da função gets(), nada mais
justo do que existir uma função que exibe uma string.

Essa função existe e é a puts() (de put string), e sua sintaxe é idêntica a da gets():


puts( nome_da_string_a_ser_exibida);

A nossa velha e conhecida printf também serve para exibir strings.


Como dissemos, as strings são caracterizadas por %s.
Então, para exibir uma string "str" com o printf, fazemos:
printf("Minha string: %s", str);

Exemplo de código: Programa em C que pede os dados cadastrais completos


Crie um aplicativo em C que peça o nome do usuário, sua idade e data de nascimento.

Esse aplicativo é bem simples, e certamente você fará sem maiores problemas.
Porém, existe uma pequena casca de banana nele, que colocamos de propósito.

Vimos que a função scanf() pega tudo até aparecer o primeiro espaço em branco, e pára antes dele.
Já a gets() não, ela pega tudo até aparecer uma new line \n, inclusive nada. Ou seja, se você der um
ENTER, a gets() vai armazenar esse enter na string.

Note que após digitar o inteiro correspondente a idade, você dá um enter.


Esse número vai pra variável ‘idade’, mas e o ENTER, pra onde vai?
Vai pro buffer.

O problema é que a função gets() vai pegar o que está armazenado nesse buffer e vai armazenar  o
que estiver lá na string de data de nascimento!
E como evitar isso? Ora, é só apagar esse ENTER que está no buffer, usando o fflush(stdin) caso use
Windows, ou __fpurge(stdin) caso seja abençoado e use Linux.

Então nosso código em C fica:


#include <stdio.h>
// Curso C Progressivo: www.cprogessivo.net
// O melhor curso de C! Online e gratuito !
// Apostila online, tutorial completo sobre
// a linguagem de programação C !

int main(void)

{
char nome[31], sobrenome[31], nascimento[11];
int idade;

printf("Nome: ");
gets(nome);

printf("Sobrenome: ");
gets(sobrenome);

printf("Idade: ");
scanf("%d", &idade);

fflush(stdin);

printf("Data de nascimento: ");


gets(nascimento);

printf("\nNome completo: %s %s\n", nome, sobrenome);


printf("Idade: %d\n", idade);
printf("Data de nascimento: "); puts(nascimento);
return 0;

Problemas com a gets() - A função


fgets()
Como C é uma linguagem de programação de baixo nível, algumas coisas são um pouco 'chatinhas'
de serem usadas, pois se exigirá um rigor muito grande, que é pouco visto em outras linguagens de
programação.

Um exemplo disso, que já mostramos neste mesmo artigo de nossa apostila, foi o da scanf(), que só
lê até o primeiro espaço, pois isso é a característica padrão da função.
É característica padrão, e não obrigatória. Ou seja, embora poucos saibam, é possível alterar o
funcionamento da scanf(). Por exemplo, se quisermos ler strings que tenham espaço, nós temos que
dizer isso dentro da função.

Vamos dizer para a scanf() parar de pegar nossa string somente quando encontrar um caractere de
NEW LINE (um enter). Para isso, usamos o operador: [^\n]
Logo, nosso código da scanf() para ler strings com espaços e armazenar na variável "str" é:
scanf ( "%[^\n]", str);

(lembre-se de limpar o buffer, usando __fpurge(stdin) ).

Podemos ainda limitar o tamanho de nossa string, basta colocar um numero inteiro ao lado do %,
representando o número de caracteres máximo, o que é uma excelente prática, pois essa função
pode ocasionar problemas na memória, caso você estoure os limites da string.
Por exemplo:
scanf ( "%256[^\n]", str);

A função gets() peca nesse quesito, de tamanho da string, pois podemos digitar mais caracteres do
que a string alocou de memória, e "quebraríamos" o programa por conta de um overflow.
Algumas pessoas relatam problemas de usar ela em um ambiente Linux.

Uma solução para isso é usar a função fget(), que é mais segura.


Ela recebe três dados: a string que vai armazenar o que vai ser digitado ( no nosso caso é a variável
"str"), o tamanho da string e de onde vai ler (ela pode ler de um arquivo de texto, por exemplo).
Para ler do teclado, usamos stdin.

Veja como ficaria 


fgets(str, 256, stdin);

Que função usar para ler strings,


então? 
Se você está iniciando seus estudos e fazendo programas simples, apenas para aprender a
linguagem C, pode usar a gets() ou scanf(), sem problemas.

Como dissemos, elas podem ocasionar problemas na memória, onde é fácil extrapolarmos o limite da
memória, encerrando o programa por isso. Portanto, se quiser usar uma função de maneira segura,
em programas profissionais, evite a gets(). Use fgets() ou scanf() sempre com litadores de new line e
tamanho da string.

Para saber mais sobre assunto, leia:


http://linux.die.net/man/3/gets
http://stackoverflow.com/questions/3302255/c-scanf-vs-gets-vs-fgets
http://stackoverflow.com/questions/1252132/difference-between-scanf-and-fgets

Você também pode gostar