Aprendendo C - formatação do printf
TweetRecentemente comecei a aprender C. Sim eu não sei C, não tive na faculdade e sempre senti falta de saber melhor como as coisas funionavam por dentro do computador, já que minha maior experiencia em programação é com python, que é uma linguagem de altissimo nivel.
Com C voce trabalha mais perto da maquina, direto com bytes, alocação de memoria, tem que fazer as estruturas de dados.
E pra aprender eu escolhi estudar pelo livro Learn C The Hard Way do Zed Shaw. É um livro que te instiga a estudar os conceitos por voce mesmo, ensina em cima de exemplos bem praticos e eficientes, te adiciona ao ecossistema da linguagem, apresentando ferramentas e tecnicas que vao te ajudar a pensar em C.
Uma das coisas que ele me instigou a estudar foi todos os possiveis formatos e suas variações para o printf, a função que escreve na saida padrão (o print do python).
#include <stdio.h>
int main() {
printf("%s\n", "Hello World!");
return 0;
}
#output
Hello World!
formatando a saida do printf
O printf recebe 2 parametros: uma string com os formatos mapeados e um minimo de valores igual ao mapeado.
#include <stdio.h>
int main() {
printf("%d %s\n", 1, "Hello again!");
return 0;
}
#output
1 Hello again!
Esta função é capaz de imprimir diferentes tipos de dados (char, string, int, float, octal, hexa, outros aqui) de acordo com a formatação que voce usar.
#include <stdio.h>
int main() {
printf("Char: %c %c \n", 'b', 65); // char pode receber um int referente a Tabela ASCII (http://www.asciitable.com/).
printf("Decimais: %d %ld\n", 1988, 650000L);
printf("Precedido com espaços em branco: %10d\n", 1988);
printf("Precedido com zeros: %010d\n", 1988);
printf("Numeros com base diferente: %d %x %o %#x %#o \n", 100, 100, 100, 100, 100);
printf("Floats: %4.2f %+.0e %E \n", 3.14554, 3.3214, 3.1234);
printf("Truque de tamanho: %*d\n", 5, 10);
printf("String simples %s\n", "Oi!");
return 0;
}
#output
Char: b A
Decimais: 1988 650000
Precedido com espaços em branco: 1988
Precedido com zeros: 0000001988
Numeros com base diferente: 100 64 144 0x64 0144
Floats: 3.15 +3e+00 3.123400E+00
Truque de tamanho: 10
String simples Oi!
Tabela de Formatos
Os formatos seguem o seguinte prototipo: %[
flags][tamanho][.precisao][quantidade]formatoFlags, largura, .precisão, tamanho são opcionais.
Formatos:
| Formato | Saida | Exemplo |
|---|---|---|
| c | char | a |
| d ou i | signed int | 1 |
| e | Notação Cientifica usando o caracter e | 3.9265e+2 |
| E | Notação Cientifica usando o caracter E | 3.9265E+2 |
| f | float | 3.4 |
| g | usa o menor numero possivel de f e e | 3.54 |
| G | usa o menor numero possivel de f e E | 3.54 |
| o | unsigned octal | 610 |
| s | string | Hello World |
| u | unsigned int | 2345 |
| x | unsigned hexa | 7fa |
| X | unsigned hexa com letras maiusculas | 7FA |
| p | ponteiro de endereço | B800:0000 |
| n | Nada impresso. O argumento deve ser um ponteiro para um int assinado, onde o número de caracteres escritos até então é armazenado. | |
| % | % seguido de outro % irá printar % na saida | % |
Flags
| Flag | Descrição |
|---|---|
| - | Alinhado a esquerda dentro do tamanho definido. Alinhamento a direita é o padrão (veja a tabela de formatação de tamanho). |
| + | Força a o resultado ser mostrado com um simbolo de + ou -. Por padrão, somente numeros negativos são mostrados com -. |
| # | Usado com o, x e X indica que o valor será precedido de 0, 0x ou 0X respectivamente, para valores diferentes de 0. Usado com e, E e f, força o output para mostrar um ponto decimal mesmo sem numeros depois dele. Por padrão, se nenhum numero estiver depois do ponto decimal ele nao é mostrado. Usado com g e G o resultado é mostrado com zeros a direita. |
| 0 | Numero 0 é printado ao invés de espaços em branco quando o tamanho é especificado. (veja a tabela de formatação de tamanho). |
Modificadores de Tamanho
| Tamanho | Descrição |
|---|---|
| (Numero) | Número minimo de caracteres a serem printados. Se o valor a ser printado for menor que o numero, será adicionado espaços em branco para atigir o numero limite. O valor nao é trucado caso seja maior que o limite. |
| * | O tamanho nao é especificado na formatação da string, mas é passado como argumento precedendo o argumento a ser formatado |
Modificadores de Precisão
| .precisão | Descrição |
|---|---|
| .numero | Para formatos inteiros (i, d, u, o, x, X): precisão especifica o numero minimo de digitos a serem mostrados. Se a quantidade de digitos for menor que o limite, entao serão acrescentados zeros ao final. O valor nao é truncado se a quantidade de digitos for maior que o limite. Precisão 0 significa que o nenhum valor é printado se o numero for 0. Para formatos e, E, f: é o numero de digitos que serão mostrados depois do ponto decimal. Para formatos g e G: é o numero maximo de digitos significantes a serem mostrados. Para s: é o numero maximo de caracteres a serem mostrados. Por padrão, todos os caracteres serão mostrados até o caracter nulo que finaliza uma string (por exemplo \n) Para c: não tem efeito. Quando nenhuma precisão é especificada, o padrão é 1. Se o periodo é especificado sem um valor explicito para precisão, 0 é assumido. |
| .* | A precisão nao é especificada na formatação da string, mas é passado como argumento precedendo o argumento a ser formatado. |
Modificadores de Quantidade
| quantidade | Descrição |
|---|---|
| h | O argumento é interpretado como um short int ou unsigned short int (só se aplica aos formatadores de inteiro: i, d, o, u, x, X). |
| l | O argumento é interpretado como um long int ou unsigned long int (só se aplica aos formatadores de inteiro: i, d, o, u, x, X) e como um caractere de largura ou cadeia de caracteres de largura para formatadores c e s. |
| L | O argumento é interpretado como um long double (somente para formatadores de float: e, E, f, g e G). |
O printf é muito poderoso, e espero ter ajudado a conhece-lo melhor.
Obrigado, até a proxima!
Aprenda Vim Progressivamente
TweetSou usuario do vim a algum tempo e sempre estou procurando aprender mais e mais sobre esse excelente editor.
Recentemente encontrei um otimo post no blog do Yann Esposito para iniciantes aprenderem vim rapidamente e tambem para veteranos querendo aprender algumas magicas desse otimo edito de texto.
Gostei tanto do post que resolvi traduzi-lo para divulgar o vim e mostrar como voar com ele.
Então vamos ao post!
TL;DR: Quer aprender vim (o melhor editor conhecido pela humanidade) da forma mais rapida possivel. Eu sugiro um caminho. Comece aprendendo o basico pra sobreviver, entao integre todos os truques devagar
