Vamos Programar? – Introdução à Programação #21

24 Comentários

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.

intrprog21

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
#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
#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.

Comentários

24

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

  1. Avatar de Tiago Costa
    Tiago Costa

    Quero aprender a programar e ja comprei um macbook pro retina para comecar, que programa devo instalar para programar em C? eclipse?

    1. Avatar de Zé

      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.

      1. Avatar de Tiago Costa
        Tiago Costa

        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 !

        1. Avatar de lmx
          lmx

          🙂

          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

    2. Avatar de Miguel Azevedo
      Miguel Azevedo

      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.

      1. Avatar de Tiago Costa
        Tiago Costa

        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?

        1. Avatar de Miguel Azevedo
          Miguel Azevedo

          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.

    3. Avatar de 4 Dummies
      4 Dummies

      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!

      1. Avatar de Cabecinha Pensadora
        Cabecinha Pensadora

        Melhor comentário dos últimos tempos xD

      2. Avatar de Tiago Costa
        Tiago Costa

        e bom sinal, e sinal que mac e um bugatti e windows/androids sao fiat puntos! xD

    4. Avatar de Zé

      eheh. Se já compraste um Mac não é preciso mais nada, já és grande programador.

  2. Avatar de Zé

    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.

  3. Avatar de lmx
    lmx

    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 😉

    1. Avatar de Henrique Dias

      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.

      1. Avatar de lmx
        lmx

        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

        1. Avatar de Henrique Dias

          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.

    2. Avatar de José Carlos Ferreira
      José Carlos Ferreira

      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*/

      1. Avatar de Henrique Dias

        Obrigado pela sugestão. 🙂

  4. Avatar de Jose Simoes
    Jose Simoes

    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.

    1. Avatar de Henrique Dias

      Obrigado pelas correções 🙂 Bom fim de semana.

      1. Avatar de José Carlos Ferreira
        José Carlos Ferreira

        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.

        1. Avatar de Miguel Moura
          Miguel Moura

          Boa noite,
          Mas também é grande asneira utilizar o scanf dessa maneira!!!

  5. Avatar de José Carlos Ferreira
    José Carlos Ferreira

    Por isso mesmo disse que é preciso ter algum cuidado ao usar a função scanf ();

    1. Avatar de Miguel Moura
      Miguel Moura

      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.