Vamos Programar? – Introdução à Programação #21
Ler e imprimir strings.
O mundo está constantemente a evoluir: desde o mais pequeno inseto à espécie Humana. Dentro das palavras que mais ouvimos atualmente, incluímos “evolução”, “mudança”, “futuro”.
A tecnologia tem revolucionado o mundo das mais diversas formas: do mais simples aparelho para medir o tempo ao mais complexo acelerador de partículas. Se quer entrar no mundo da tecnologia e deixar a sua marca, pode começar aqui.
Depois de vos explicarmos o que são e como se utilizam strings na Linguagem C, é importante saber como as podemos ler e imprimir no ecrã. Antes de continuarmos, é importante referir que o "seletor" utilizado para strings é \%s.
Imprimir strings
A impressão de strings no ecrã pode ser feita de diversas formas. Iremos abordar duas delas: a função printf, já conhecida por todos vós, e a função puts.
Função printf
Esta função já é conhecida por todos vós e permite a impressão de diversos tipos de dados de forma bastante simples.
Sintaxe
Para a utilizar com strings basta escrever da seguinte forma: printf("Esta é uma string: %s", nomeDaString);
Ou seja, é bastante útil quando necessitamos de imprimir uma string variável intercalada com algum outro texto.
Função puts
Por outro lado, temos a função puts que quer dizer put string. Esta função é bastante útil quando precisamos imprimir apenas uma sequência de caracteres variável.
Sintaxe
Ora veja a sintaxe: puts(nomeDaString);
Leitura de Strings
Finalmente, abordaremos como se leem strings escritas pelo utilizador.
Função scanf
A utilização da função scanf para obter sequências textuais é semelhante à forma que utilizamos para ler números, tanto inteiros, como decimais. Porém, existe uma pequena diferença.
Sintaxe
Veja a sintaxe e tente descobrir a diferença que existe (além do uso de \%s): scanf("%s", nomeDaString);
Como pode verificar, ao contrário do que acontecia com os restantes tipos de variáveis, neste não colocamos o operador & antes do nome da variável. Porquê? Porque as variáveis que contêm strings são arrays, logo o seu nome aponta para a primeira posição da memória ocupada por todo o array. Daí não ser necessário o uso do operador &.
Exemplo
No seguinte exemplo pode ver como utilizamos esta função para obter diversos dados do utilizador que depois são imprimidos recorrendo à função printf anteriormente abordada.
#include
int main() { char nome[21], apelido[21], morada[51], codigoPostal[11];
printf("Por favor insira os seus dados conforme pedido:\n\n"); printf("Primeiro nome: "); scanf("%s", nome);
printf("Último nome: "); scanf("%s", apelido);
printf("Morada: "); scanf("%s", morada);
/* Limpeza do buffer no Windows. Usar "_fpurge(stdin)" em sistemas Unix */ fflush(stdin);
printf("Código Postal: "); scanf("%s", codigoPostal);
printf("\nO seu Cartão de Identificação:\n"); printf("Nome: %s, %s\n", apelido, nome); printf("Morada: %s\n", morada); printf("Código Postal: %s\n", codigoPostal); return 0;
}
Função gets
Outra função que nos permite ler strings é a função gets, cujo nome advém de get string, ou seja, obter string. A utilização desta função é algo bastante simples.
Sintaxe
Ora veja a sintaxe: gets(nomeDaString);
Onde "nomeDaString" se refere ao apontador que aponta para a primeira posição do array que contém a sequência de caracteres.
Exemplo
Aqui pode ver como fica o programa do exemplo anterior utilizando esta função.
#include
int main() { char nome[21], apelido[21], morada[51], codigoPostal[11];
printf("Por favor insira os seus dados conforme pedido:\n\n"); printf("Primeiro nome: "); gets(nome);
printf("Último nome: "); gets(apelido);
printf("Morada: "); gets(morada);
printf("Código Postal: "); gets(codigoPostal);
printf("\nO seu Cartão de Identificação:\n"); printf("Nome: %s, %s\n", apelido, nome); printf("Morada: %s\n", morada); printf("Código Postal: %s\n", codigoPostal); return 0; }
Exercícios
Esta semana temos poucos exercícios para vós. Aqui vai:
1 - Criar um pequeno programa que peça o primeiro nome ao utilizador e que o imprima de trás para a frente.
2 - Criar uma aplicação que peça os utilizadores o seu nome, o seu apelido, a sua data de nascimento, morada, código postal, número de telemóvel, telefone e que imprima uma espécie de BI.
Mais uma vez, gostávamos de saber a sua opinião. Caso tenha alguma dúvida, pode sempre utilizar os comentários para colocar a questão. Caso o faça, pedimos que utilize a keyword [DUVIDA] no início do seu comentário.
Este artigo tem mais de um ano
Quero aprender a programar e ja comprei um macbook pro retina para comecar, que programa devo instalar para programar em C? eclipse?
Se queres aprender programar não é preciso dizer que compraste um macbook pro retina TDi 177hp.
Qualquer computador serve 😉
btw, Para começares, instala o compilador gcc e usa um editor qualquer com highlight sintax.
eu sei mas e da emoção por ser o meu primeiro mac , e apesar de ter de aprender tudo estou a adorar a experiência! Como trabalho diariamente com fotografia, video e musica escolhi mac osx por ser o melhor, e depois nunca tive um portatil tao bem construido, silencioso e com qualidade de ecra tao suberba como este. So tinha tido um ipad, este e o 2o produto da apple e para ja muito satisfeito! Nem percebo porque criticam tanto a apple, espero nunca vir a perceber !
🙂
Parabéns pela aquisição, que te traga muita alegria 😉
Nunca tive, mas é seguramente a melhor opção comercial que por ai anda 😉
Para C?
tens que ter a librarias de sistema, e um compilador 😉
mais nada!
Depois claro, podes usar um editor de texto para programar, ou um IDE tipo eclipse, ou netbeans, ou xcode talvez suporte C…isso depois é uma coisa que tens que ser tu a escolher 😉
Eu pessoalmente não saiu do geany, ou um editor de texto, quando é alguma coisa tipo um dois ficheiros, mas o xcode talvez dê e ha muita malta por ai que adora esse IDE nos MAC’s..
cmps
Tiago,
Instala o XCode no teu Mac e igualmente as Command Line Tools directamente do site da apple.
Penso que teras que criar uma conta de developer.
Depois e so desenvolver.
Outra solucao e instalares um editor (sublime por exemplo).
Se abrires uma janela de comando no Mac e escreveres gcc vais ver que vem instalado de rais no Mac! O gcc e o teu compilador. Usa-o para compilares os teus programas via command line.
Espero ter ajudado.
Ja o fiz, muito obrigado! Tens mac? Gostaria de trocar impressões com alguém entendido em mac osx porque so comecei agora e ate instalar/desinstalar ainda faz confusao por ser diferente(apesar de ser mais logico e fácil que windows ate). Em relacao ao office chega bem o da apple ou o da microsoft para mac e melhor?
Ola Tiago,
Para instalar/desinstalar vai vendo os HowTo’s para mac conforme vais precisando e chegaras brevemente a um ponto que e intuitivo.
Relativamente ao office n te posso dar grande ajuda pq nunca usei a versao mac.
Eu quero aprender a conduzir.
Pela lógica, a primeira coisa era comprar o livro de
código, mas não, o que comprei mesmo foi um Bugatti Veyron.
Experimenta comprar um livro técnico de programação!
Melhor comentário dos últimos tempos xD
e bom sinal, e sinal que mac e um bugatti e windows/androids sao fiat puntos! xD
eheh. Se já compraste um Mac não é preciso mais nada, já és grande programador.
Boas
Algumas notas.
A instrução “fflush(stdin)” nunca deve ser utilizada. Felizmente esta função não funciona em linux.
A função gets também deve ser evitada. Usem antes fgets.
boas…
Para posix, não existe uma resposta para o fflush.
o fgets, também me parece a melhor solução, ou melhor…o melhor contorno para a falta de uma solução 😉
Olá Zé e lmx!
Sim, é verdade, mas de momento estamos a utilizar estes comandos, não esquecendo que esta saga de artigos se mantém sendo uma introdução à Linguagem.
De qualquer forma, já havíamos mencionado que esses dois comandos (fflush e _ffpurge) não devem ser muito utilizados em tutoriais anteriores 🙂
Um excelente fim de semana.
boas Henrique,
Eu percebi, não fiques com a ideia que foi uma critica.
Que não foi mesmo! 😉
Estes problemas de portabilidade afectam muita gente!
Eu, muitas das vezes, sou a primeiro a ser apanhado “na curva”, com problemas destes… 🙂
Abraço e bom fim de semana
Olá lmx!
Claro que encarei como uma crítica. Mas, existem críticas destrutivas e críticas construtivas. Considerei a sua uma das últimas 🙂 Bom fim-de-semana.
Solução para limpar o stdin portável para qualquer (ou 99% dos SO’s):
#define CLEAR_INPUT while (!getchar ()) /*void*/
usage:
CLEAR_INPUT; /*as simple as this*/
Obrigado pela sugestão. 🙂
Na minha modesta opinião só falto discutir o problema GRAVE do que se passa se o utlizador digitar um número de caracteres superior à memória disponível a começar na apontada por “nomeDaString”.
Já agora, e isto é uma questão mais formal, “nomeDaString” quando apareçe como argumento das fcs em estudo é o nome de um ponteiro para um caracter, não de um array de caracteres.
Obrigado pelas correções 🙂 Bom fim de semana.
Também acho que é importante dizer que convém ler a definição da função “scanf ()” e perceber o quão importante é fazer coincidir o formato de leitura escolhido e a forma como os dados são introduzidos.
Exemplo:
scanf (“%d%d”, &int1, &int2);
vai dar asneira se houver mais scanf’s a seguir a este, porque para validarmos o segundo dado itroduzido, pressionamos a tecla “Enter” e esta não é lida pelo scanf, ficando no stdin. Mas o scanf seguinte irá ser a primeira coisa que vai ler. Este “Enter” vai dar problemas. Portanto convém ter algum cuidado. Uma solução é o uso da macro que coloquei uns posts acima.
Boa noite,
Mas também é grande asneira utilizar o scanf dessa maneira!!!
Por isso mesmo disse que é preciso ter algum cuidado ao usar a função scanf ();
Deu para perceber José Carlos 🙂
O C é uma liguagem relativamete fácil mas cheia de armadilhas. Num nível introdutório estas questões são muitas vezes deixadas de parte e depois provocam a longo prazo erros de programação em produção.
Concordo que as boas práticas e a aplicação de “design patterns” sejam adoptados desde inicio… Mas neste caso essa é a parte do Henrique Dias 🙂
Um abraço.