C II: avançando na linguagem | Alura Cursos Online
Primeiras aulas do curso C II: avançando na linguagem
C II: avançando na linguagem
O Jogo de Forca - Introdução
Manipulando Arrays - Conhecendo os arrays
Para se começar um jogo de forca, de maneira análoga ao nosso jogo de adivinhação, é guardar a palavra secreta. Até agora, já conhecemos diversos tipos de variáveis, como int, double, float, long, mas ainda não vimos o tipo usado para se guardar um texto.
Em C, para guardarmos uma única letra, usamos o tipo char. E o declaramos da mesma forma que os outros. Mas, para se passar a letra a ser armazenada, usamos aspas simples. Para imprimir, usamos a máscara "c" no printf. Veja o código abaixo:
char letra1 = 'M';
char letra2 = 'F';
char letra3 = 'A';
printf("%c %c %c", letra1, letra2, letra3);
Ele nos imprime as letras "M", "F" e "A". Mas e para guardar uma palavra? Será que precisamos armazenar letra a letra? A resposta é sim. Precisamos guardar uma a uma, mas para isso não teremos uma variável diferente para cada letra. Aliás, se tivéssemos, ficaríamos malucos. Imagina para guardar um texto inteiro? Quantas variáveis teríamos?
E o pior, não conseguiríamos fazer códigos dinâmicos para imprimir palavras de tamanhos diferentes. Não conseguimos escrever um for, por exemplo, para imprimir as várias letras:
// imagine uma palavra com 10 letras
// não temos uma maneira de "gerar dinamicamente"
// o nome da variável a ser impressa.
// Ou seja, não conseguimos imprimir "letra1",
// depois "letra2", e assim por diante.
printf("%c", letra(i));
O que usaremos para isso é o que chamamos de array. Arrays são uma maneira de guardarmos "vários" de um só tipo. Esses elementos ficam armazenadas na memória, um ao lado do outro. Por exemplo, um array de inteiros guarda um monte de números inteiros. Um array de char guarda um monte de caracteres. E assim por diante. E a vantagem do array é que, no momento da declaração, dizemos o tamanho dele. E aí acessamos cada um desses elementos por meio de um índice.
Veja, por exemplo, uma declaração de um array de inteiros, com 5 posições. Veja que a declaração é idêntica, com exceção do uso dos colchetes:
Agora, para usar esse array, guardando e lendo inteiros dele, basta usarmos os colchetes para definirmos a posição que queremos acessar. Afinal, temos 5. O único detalhe importante é que, se nosso array tem 5 posições, elas vão de 0 a 4. A primeira posição de um array é o 0 (e não o 1, como muitos confundem):
// guardando na primeira posição do array
notas[0] = 10;
// guardando na segunda posição
notas[1] = 5;
// imprimindo a primeira posicao
printf("%d", notas[0]);
Manipulando Arrays - Criando e imprimindo um array de caracteres
Para então guardarmos nossa palavra secreta, vamos declarar um array de char. Vamos definir seu tamanho como 20:
char palavrasecreta[20];
Podemos guardar nossa palavra dentro dele, da mesma forma que estávamos fazendo antes. A diferença é que o número que passamos entre colchetes, pode vir de uma variável:
palavrasecreta[0] = 'M';
palavrasecreta[1] = 'E';
palavrasecreta[2] = 'L';
palavrasecreta[numero] = 'A';
palavrasecreta[4] = 'N';
palavrasecreta[5] = 'C';
palavrasecreta[6] = 'I';
palavrasecreta[7] = 'A';
Um trabalhão. Para imprimir a palavra, fica um pouco mais fácil. Afinal, como podemos usar variáveis ali no índice, conseguimos fazer um loop com o tamanho da palavra:
printf("%c", palavrasecreta[i]);
Entretanto, um array de char é um array especial. Como nós o usamos para guardar textos, temos funções especializadas para facilitar nossa vida na hora de colocar dados dentro dele. Essas funções também vão nos ajudar a escrever loops mais flexíveis (o 8 ali está fixo, mas queremos que ele se adapte ao tamanho da palavra).
A função sprintf() é muito parecida com a printf(). Enquanto o printf imprime na tela, a sprintf imprime em um array de chars (o s** é justamente de **string). Então, se quisermos guardar a palavra secreta no array, fazemos:
sprintf(palavrasecreta, "MELANCIA");
Para imprimirmos na tela, usamos o printf com a máscara "s". Ela faz com que todo o array seja impresso. Veja:
printf("%s", palavrasecreta);
Mas, veja que interessante. Nosso array tem 20 posições e a palavra "melancia" tem apenas 8 caracteres. Como que ele soube que deveria parar no último "a"? Por que ele não imprimiu 20 caracteres? Strings em C tem um pequeno detalhe: sempre que guardamos uma palavra lá, como melancia, que ocupa 8 posições, guardamos um caractere especial na 9a posição. Esse caractere nos diz que a string acaba ali, e que o resto é "lixo". Esse caractere é representado pelo símbolo \0 (barra zero). Apesar de serem dois caracteres, lembre-se que o barra é especial. Esse \0 é armazenado em uma única posíção.
Ou seja, quando fizemos o sprintf(), ele escreveu na verdade o texto "MELANCIA\0". A função printf(), sabendo disso, foi lendo o array de chars até encontrar o \0. Encontrou, parou.
Se estivéssemos declarando as letras dessa palavra uma a uma, igual fizemos acima, bastaria adicionar o \0 ao final, que o printf("%s") funcionaria normalmente:
palavrasecreta[3] = 'A';
// colocando o \0 para indicar que a string acabou
palavrasecreta[8] = '\0';
Sobre o curso C II: avançando na linguagem
O curso C II: avançando na linguagem possui 185 minutos de vídeos, em um total de 66 atividades. Gostou? Conheça nossos outros cursos de Linguagem C e C++ em Programação, ou leia nossos artigos de Programação.