Obra: Programar em C/Entrada e saída simples
Matéria: Português
entrada saída simples se você pensar bem perceberá que um computador praticamente inútil se não tiver nenhuma maneira de interagir com usuário por exemplo se você abrir um processador de texto nada irá acontecer até que você abra um arquivo ou digite algum texto no teclado mas da mesma maneira necessário que computador forneça informação também como você poderia saber se uma tarefa foi concluída as trocas de informação entre computador usuário são chamadas entrada saída input output em inglês entrada informação fornecida um programa saída informação fornecida pelo programa comum referir se aos dois termos simultaneamente entrada saída ou em inglês frequentemente são usados os termos saída padrão standard output stdout entrada padrão standard input stdin eles se referem na maioria das vezes ao monitor ao teclado que são os meios básicos de interação com usuário no entanto os sistemas operacionais permitem redirecionar saída entrada de programas para outros dispositivos ou arquivos as funções de entrada saída na linguagem trabalham com fluxos streams em inglês de dados que são uma forma de abstração de dados de maneira sequencial assim toda entrada saída feita da mesma maneira com as mesmas funções não importando dispositivo com qual estamos nos comunicando teclado terminal arquivo etc as mesmas funções que descrevem acesso aos arquivos podem ser utilizadas para se acessar um terminal de vídeo em as funções da biblioteca padrão para entrada saída estão declaradas no cabeçalho stdio uma delas já foi introduzida em seções anteriores printf seguir daremos mais detalhes sobre essa função introduziremos outras puts putchar puts significa put string colocar string utilizado para colocar uma string na saída de dados putchar significa put char colocar caractere utilizado para colocar um caractere na saída de dados são as funções mais simples do cabeçalho stdio ambas enviam ou imprimem saída padrão os caracteres fornecidos elas putchar manda apenas um caractere puts manda uma sequência de caracteres ou string exemplo puts esta uma demonstração da função puts putchar note que junto com função puts devemos usar literais de string com aspas duplas com putchar devemos usar literais de caractere com aspas simples se você tentasse compilar algo como putchar compilador daria uma mensagem de erro lembre se que diferente de podemos também colocar caracteres especiais como tabulação quebra de linha puts primeira linha nsegunda linha te um grande espaço putchar apenas envia uma quebra de linha este código resultaria em algo parecido com primeira linha segunda linha um grande espaço observe que função puts sempre coloca uma quebra de linha após imprimir string já com as funções putchar printf vista seguir isso não ocorre código abaixo por exemplo putchar putchar putchar puts string puts outra string imprimiria algo parecido com isto ch string outra string observe que os caracteres são exibidos na mesma linha pois não foi inserida uma quebra de linha entre eles já as st
caracteres são exibidos na mesma linha pois não foi inserida uma quebra de linha entre eles já as strings string outra string são exibidas em linhas diferentes pois função puts insere uma quebra de linha após cada string mesmo que não haja um caractere nas literais de string do código os outros caracteres especiais são introduzidos adiante note que argumento deve ser uma sequência de caracteres se você tentar por exemplo imprimir número desta maneira puts na verdade que compilador tentará fazer imprimir sequência de caracteres que começa na posição da memória provavelmente ele irá alertá lo sobre isso se você tentar compilar esse código se você tentar executar esse código provavelmente ocorrerá uma falha de segmentação erro que ocorre quando um programa tenta acessar memória que não lhe pertence maneira correta de imprimir número seria colocá lo entre aspas duplas puts printf printf vem de print formatted imprimir formatado primeira vista função printf pode parecer idêntica puts no entanto ela muito mais poderosa ela permite facilmente imprimir valores que não são sequências de caracteres além de poder formatar os dados juntar várias sequências de caracteres por isso função printf muito mais usada que puts ela pode ser usada exatamente como função puts se fornecermos ela apenas uma sequência de caracteres printf este um programa em ela também pode ser escrita da seguinte forma printf ola mundo mas se precisarmos imprimir conteúdo de uma variável função printf também pode fazer isso você deve obviamente especificar onde valor da variável deve ser impresso isso feito através da especificação de formato caso variável seja do tipo int sequências para outros tipos serão dadas adiante você também precisará logicamente especificar qual variável imprimir isso feito dando se mais um argumento função printf código deverá ficar assim int teste teste printf variável teste contém número teste tendo colocado isso no seu programa você deverá ver na tela variável teste contém número vamos supor que você queira imprimir um número não inteiro você teria que trocar por exemplo float pi pi printf valor de pi pi código acima irá retornar valor de pi você pode imprimir quantos valores quiser bastando para isso colocar mais argumentos mais especificações de formato lembrando de colocar na ordem certa alguns compiladores como gcc mostram um aviso caso número de argumentos seja diferente do número de especificações de formato que provavelmente causaria resultados indesejados sintaxe geral da função printf printf string de formatação arg arg suponha que você tem um programa que soma dois valores para mostrar resultado da conta você poderia fazer isso int leitura dos dados resultado da soma printf que resultaria em para seguir mostramos os especificadores de formato para vários tipos de dados especificações de formato documentação mais técnica os chama de especificadores de conversão pois que ocorre na maioria das vezes de fato conversão de um valor numérico em uma sequênc
conversão pois que ocorre na maioria das vezes de fato conversão de um valor numérico em uma sequência de caracteres que representa aquele valor mas nome formato não deixa de estar correto pois eles especificam em que formato inteiro real etc está argumento correspondente código conversão formato do argumento número decimal inteiro int também pode ser usado como equivalente número decimal natural unsigned int ou seja sem sinal número inteiro representado na base octal exemplo corresponde ao decimal número inteiro representado na base hexadecimal exemplo corresponde ao decimal se usarmos as letras serão maiúsculas hexadecimal com letras maiúsculas número decimal de ponto flutuante no caso da função printf devido às conversões implícitas da linguagem serve tanto para float como para double no caso da função scanf serve para float lf serve para double número em notação científica por exemplo podemos usar para exibir maiúsculo número em notação científica com maiúsculo escolhe automaticamente mais apropriado entre novamente podemos usar para escolher entre ponteiro exibe endereço de memória do ponteiro em notação hexadecimal caractere imprime caractere que tem código ascii correspondente ao valor dado sequência de caracteres string em inglês imprime um observação se você quiser imprimir um sinal de porcentagem use exemplo printf lucro para último mês foi de numa sequência de controle possível também indicar largura do campo número de casas decimais tamanho da variável algumas opções adicionais formato geral opçõeslargura do campo precisãotamanho da variáveltipo de dado única parte obrigatória tipo de dado todas as outras podem ser omitidas opções as opções são parâmetros opcionais que alteram formatação você pode especificar zero ou mais delas colocando as logo após sinal de porcentagem tamanho do campo deve ser preenchido com zeros esquerda quando necessário se parâmetro correspondente for numérico hífen valor resultante deve ser alinhado esquerda dentro do campo padrão alinhar direita espaço no caso de formatos que admitem sinal negativo positivo deixa um espaço em branco esquerda de números positivos sinal do número será sempre mostrado mesmo que seja positivo aspa simples apóstrofo números decimais devem ser exibidos com separador de milhares caso as configurações regionais especifiquem essa opção normalmente só funciona nos sistemas unix largura do campo como próprio nome já diz especifica qual largura mínima do campo se valor não ocupar toda largura do campo este será preenchido com espaços ou zeros por exemplo podemos imprimir um código de até dígitos preenchido com zeros de maneira que os valores apareçam como largura deve ser especificada logo após as opções se presentes pode ser um número que especifica largura ou um asterisco que diz que largura será especificada pelo próximo argumento ou seja argumento anterior ao valor ser impresso neste exemplo campo terá largura igual ao valor de num valor impresso será printf num campo impresso de aco
xemplo campo terá largura igual ao valor de num valor impresso será printf num campo impresso de acordo com as seguintes regras se valor for mais largo que campo este será expandido para poder conter valor valor nunca será cortado se valor for menor que campo largura do campo será preenchida com espaços ou zeros os zeros são especificados pela opção que precede largura alinhamento padrão direita para se alinhar um número esquerda usa se opção hífen ou sinal de menos antes da largura do campo por exemplo compare as três maneiras de exibir número printf exibe printf exibe printf exibe alguns outros exemplos printf josé exibe josé printf josé exibe josé printf josé exibe josé precisão precisão pode ter quatro significados diferentes se conversão solicitada for inteira número mínimo de dígitos exibir será preenchido com zeros se necessário se conversão for real número de casas decimais exibir valor será arredondado se precisão especificada no formato for menor que do argumento se conversão for em notação científica número de algarismos significativos valor será arredondado se número de algarismos significativos pedido for maior que do argumento se conversão for de uma sequência de caracteres número máximo de caracteres exibir assim como largura do campo precisão pode ser especificada diretamente por um número ou com um asterisco mas deve ser precedida por um ponto alguns exemplos printf exibe printf exibe printf exibe printf bom dia exibe bom claro que podemos combinar largura com precisão por exemplo indica um campo de número real de comprimento total dez com casas decimais note que na largura do campo valor inteiro levado em conta inclusive ponto decimal não apenas parte inteira por exemplo essa formatação aplicada ao número irá resultar nisto tamanho da variável importante ressaltar que quando são usados modificadores de tamanho de tipos maneira como os dados são armazenados pode tornar se diferente assim devemos informar função printf precisamente qual tipo da variável cujo valor desejamos exibir função printf admite cinco principais modificadores de tamanho de variável hh indica que conversão inteira corresponde uma variável char por exemplo poderíamos usar formato hhd para exibir uma variável do tipo char na base decimal indica que conversão inteira corresponde uma variável short indica que conversão inteira corresponde uma variável long ll indica que conversão inteira corresponde uma variável long long indica que conversão de número real corresponde uma variável long double quando tipo da variável não tem modificadores de tamanho long ou short não se usa nenhum modificador de tamanho da variável na função printf sequências de escape sequências de escape são combinações de caracteres que têm significado especial são sempre iniciadas por uma barra invertida você pode usá las em qualquer literal de caractere ou string por exemplo string linha nlinha equivale linha linha pois sequência indica uma quebra de linha como foi citado anteriormente funçã
a equivale linha linha pois sequência indica uma quebra de linha como foi citado anteriormente função printf diferentemente de puts não imprime automaticamente uma quebra de linha no final da string código abaixo por exemplo printf string printf string imprimiria isto string string isso pode ser útil pois às vezes desejável permanecer na mesma linha seguir apresentamos tabela com as sequências de escape suportadas pela linguagem sequência significado quebra de linha line feed ou lf tabulação horizontal retrocede cursor em um caractere backspace retorno de carro carriage return ou cr volta cursor para começo da linha sem mudar de linha emite um sinal sonoro alimentação de formulário form feed ou ff tabulação vertical em impressoras aspa dupla aspa simples barra invertida caractere nulo caractere de valor zero usado como terminador de strings caractere cuja representação octal dígitos de xn caractere cuja representação hexadecimal dígitos de de representação octal hexadecimal também possível trocar uma sequência de escape pelo seu valor em octal ou hexadecimal você pode por exemplo trocar caractere pelo valor octal ou hexadecimal vejamos mais alguns exemplos hexadecimal octal caracter scanf função scanf lê dados da entrada padrão teclado os guarda em variáveis do programa assim como para printf usamos uma string de formatação para especificar como serão lidos os dados sintaxe de scanf esta scanf string de formatação arg arg como você pode ver sintaxe quase igual de printf com exceção do comercial você entenderá melhor seu uso nas seções seguintes mas adiantamos que ele um operador que retorna endereço de uma variável isso necessário pois função scanf deve modificar as variáveis quando não usamos operador de endereço passamos apenas valor de uma variável para função isso será explicado melhor no capítulo sobre ponteiros fato de scanf receber endereços de variáveis em vez de seus valores também explica por que ele precisa ser informado da diferença entre float lf double enquanto que printf não precisa um exemplo básico da utilização de scanf este int scanf que este exemplo faz declarar uma variável aguardar usuário digitar algo os dados só serão processados quando usuário apertar enter depois disso os caracteres digitados pelo usuário serão convertidos para um valor inteiro esse inteiro será guardado no endereço que corresponde variável se valor digitado não puder ser convertido porque usuário não digitou nenhum algarismo válido variável não será modificada assim como na função printf podemos receber quantos valores quisermos bastando usar vários especificadores de conversão int char float scanf dessa maneira se usuário digitar teremos igual igual ao caractere igual ao número se usuário tentar digitar mais de um espaço entre os dados ou simplesmente nenhum espaço ainda assim programa obterá os dados certos por exemplo também dará mesmo resultado agora uma questão um pouco mais difícil vamos supor que especificamos um formato inteiro usuário digitou u
uma questão um pouco mais difícil vamos supor que especificamos um formato inteiro usuário digitou um número real como por exemplo que deverá acontecer include int main int printf digite um número scanf printf no número digitado foi return se você testar com valor vai ver que programa retornará número pois função scanf apenas interpreta os caracteres válidos para aquele formato os especificadores de conversão são praticamente os mesmos que os da função printf com algumas mudanças maioria deles pula espaços em branco exceto dois não mais sinônimo de que faz interpretar valor digitado como hexadecimal se iniciar se por ou como octal se iniciar se por ou como decimal caso nenhuma dessas condições seja verificada são sinônimos de lf deve ser usado para variáveis do tipo double lê uma sequência de caracteres não brancos qualquer caractere exceto espaço tabulação quebra de linha etc ou seja uma palavra lê uma sequência de caracteres sem ignorar espaços padrão ler um caractere se não for especificada largura do campo lê uma sequência de caracteres sem ignorar espaços especificando entre colchetes quais caracteres devem ser aceitos ou se primeiro caractere dentro dos colchetes for um acento circunflexo quais não devem ser aceitos além disso se colocarmos um traço entre dois caracteres todos os caracteres entre os dois serão incluídos no padrão por exemplo se quisermos incluir qualquer letra minúscula poderiámos escrever se quiséssemos também incluir as maiúsculas colocaríamos za leitura pára quando for encontrado um caractere que não coincide com padrão especificado já os modificadores funcionam de maneira bastante diferente modificador asterisco especifica que valor atual deve ser lido da maneira especificada mas não será guardado em nenhuma variável portanto não deve haver um ponteiro correspondente esse valor por exemplo poderiámos ter um programa que espera ler uma palavra depois um número mas não importa qual palavra nesse caso usaríamos modificador scanf numero programa leria palavra guardaria número na variável numero como na função printf existe especificador de largura do campo que deve aparecer antes do especificador de conversão mas em scanf ele especifica largura máxima se largura máxima foi definida como scanf pulará para próximo campo se já tiver lido caracteres por exemplo scanf num lerá um número de até quatro algarismos se usuário digitar mais excedente será não será lido por essa chamada mas poderá ser lido por uma próxima chamada scanf mais detalhes sobre os especificadores de conversão os modificadores podem ser encontrados na documentação da biblioteca padrão valor de retorno funcão scanf retorna número de conversões realizadas com sucesso isso útil pois se valor contido numa variável após chamada de scanf for igual ao valor anterior não possível saber se valor digitado foi mesmo que já havia ou se não foi feita conversão para obter esse número de conversões realizadas você deve guardar resultado numa variável do tipo int veja como p
se número de conversões realizadas você deve guardar resultado numa variável do tipo int veja como proceder int int num num scanf este exemplo lê dois números inteiros os guarda nas variáveis número de conversões realizadas guardado na variável num se após scanf num for diferente de sinal de que usuário digitou algo incompatível com formato desejado note que aqui introduzimos um conceito novo valor de retorno de uma função ele pode ser obtido simplesmente associando valor de uma variável chamada da função ele será detalhado na seção funções mas já possível compreender um pouco sua utilização gets getchar gets getchar assim como scanf lêem da entrada padrão assim como puts putchar não suportam formatação como nome sugere getchar lê apenas um caractere gets lê uma string até final da linha ou até que não haja mais dados para ler adiciona terminador de string sintaxe das funções gets char getchar no entanto existe um problema com função gets veja exemplo seguir include int main char buffer printf entre com seu nome gets buffer printf nome buffer return notação char buffer que ainda não foi introduzida será detalhada na seção vetores arrays pede que seja reservado um espaço para caracteres para string buffer portanto se usuário digitar mais de caracteres pois terminador de string adicionado ao que usuário digitou os caracteres excedentes adicionais serão colocados na área de memória subsequente ocupada pela variável escrevendo uma região de memória que não está reservada string este efeito conhecido como estouro de buffer pode causar problemas imprevisíveis por isso não se deve usar função gets mais tarde introduziremos função fgets que não apresenta esse problema que deve ser usada no lugar de gets sprintf sscanf sprintf sscanf são semelhantes printf scanf porém ao invés de escreverem na saída padrão ou lerem da entrada padrão escrevem ou lêem em uma string única mudança nos argumentos necessidade de especificar string que deve ser lida ou atribuída no início veja os exemplos para entender melhor include int main int char string printf entre um valor inteiro scanf sprintf string valor de puts string return nesse exemplo mensagem que queríamos exibir na tela foi primeiramente salva em uma string depois essa string foi enviada para tela se você olhar bem se você tivesse alocado um valor menor para string também ocorreria um estouro de buffer para evitar esse problema existe função snprintf que tem mais um argumento tamanho da string deve ser colocado depois da string onde mensagem será gravada include int main int char string sscanf string printf valores lidos return nesse exemplo usamos função sscanf para interpretar os valores contidos na string guardá los nas variáveis numéricas