A função printf() e alguns caracteres especiais

Você aprendeu no artigo passado como criar seu primeiro programa na fantástica linguagem de programação C: um aplicativo que exibia uma mensagem na tela.

Pra isso, você usou a função printf. Porém, essa função é cheia de recursos, e vamos ensinar mais alguns agora.
Vamos mostrar uma porção de códigos, mas não vamos mostrar o resultado. Para você aprender a programar nunca fique copiando e colando, vá lá e digite os códigos.

Só assim você aprenderá.

Baixe nossa Apostila de C

Caracteres Especiais


Você viu que para exibirmos uma mensagem, basta escrever o texto entre aspas duplas "".

Porém, como vamos ver nesse tutorial de C, não bastante somente escrever as coisas entre aspas duplas, e que tudo vai sair exatamente como você planejou.

Teste, por exemplo, exibir uma mensagem com os seguintes caractere: " ou \


O código ficaria assim:
#include <stdio.h>
 
int main(void)
{
    printf("Aspas duplas "\n");
    printf("Barra: \");
    return 0;
}
Como explicamos antes, o que aparece no console (telinha preta) é o que está entre aspas: " isso aqui aparece".
Se você colocar aspas duplas você terá aspas duplas, o C vai interpretar que é pra ser exibido o que estiver entre a primeira e a segunda aspas, que nosso caso é o texto "Aspas duplas :". E a terceira aspas?
A terceira não era pra estar lá, o \n é um erro, por isso gera um erro na hora de compilar.

Por que o C não exibe esses caracteres?

Porque o nosso conceito de caracteres é diferente do conceito que os computadores tem.
Para nós, o caractere " é aspas duplas. Para o C, é um caractere que delimita o que vai aparecer no console.

Ou seja, pro C, esses caracteres não fazem parte do alfabeto, não estão lá por motivos de leitura para humanos, são símbolos que representam outras coisas.

Então, como exibir esses caracteres especiais na forma de texto?
Usando o caractere de \
Quando queremos que o caractere de aspas duplas apareça no console, colocamos o \ antes: \"
O C vai interpretar que, com esse símbolo \ antes, o caractere " deve ser exibido na tela.

Como exibir o caractere \ 

Coloque uma barra antes dele também.
Sim, vai ficar: \\
Quando o C encontra essas duas barras, ele entende que deve se exibir o caractere \

Nosso programa fica assim:
#include <stdio.h>
 
int main(void)
{
    printf("Aspas duplas \" \n");
    printf("Barra: \\");
    return 0;
}
Em suma, o que esse caractere faz é 'avisar' ao C que o próximo caractere, que vem logo após o \ terá um significado diferente.
Note que já usamos isso antes, para imprimir uma quebra de linha: \n
Você sabe que ao escrever \n o C não irá imprimir a barra nem o n, ele vai imprimir uma quebra de linha, ou um 'Enter'.




Sinais sonoros e outros caracteres especiais

Carriage return: \r

Esse caractere especial faz com que o cursor se mova para o início da linha:
#include <stdio.h>
 
int main(void)
{
    printf("Carriage return: \r");
    getchar();
    return 0;
}
O comando getchar() faz com que o programa espere que o usuário digite alguma tecla.
Assim o programa só termina se você digitar algo. Usamos isso para motrar que o carriage return faz com o cursor vá para o início da linha.

Tabulação horizontal (TAB): \t

#include <stdio.h>
 
int main(void)
{
    printf("Antes do \\t \t Depois do \\t");
    return 0;
}

Sons: \7 e \a

Os leitores mais antigos, que jogaram video-games como o NES ou Atari certamente vão se lembrar desse aviso sonoro, que também era utilizado em sistemas operacionais antigos e jogos de computador feitos no terminal:
#include <stdio.h>
 
int main(void)
{
    printf("\7 \a");
    return 0;
}

39 comentários:

  1. Sou iniciante, em programação C , e estou muito feliz.

    ResponderExcluir
  2. Só para complementar, pois tive essa dúvida aqui.
    Na hora de imprimir os caracteres especiais não consegui imprimir o % com a barra invertida \%.
    Para isso utilizei o seguinte %%.

    Abraços.

    ResponderExcluir
  3. nao aconteceu nada qndo eu executei esses 2 codigos no CODE BLOCK:

    #include

    int main(void)
    {
    printf("\7 \a");
    return 0;
    }//era pra emitir aviso sonoro?

    e este:

    #include

    int main(void)
    {
    printf("Antes do \\t t Depois do \\t");
    return 0;
    }// era pra ter efeito de tabulação?

    ResponderExcluir
  4. Renato você esqueceu de inserir a biblioteca no include #include



    ResponderExcluir
  5. Quando se tenta colocar qualquer biblioteca: algo . h

    O comentário é cortado.
    Quem quiser conversar mais em detalhes, discutir e tirar dúvidas, recomendamos usar o nosso fórum.

    ResponderExcluir
  6. Mto bom o site e tudo mais, mais pra quem nao entendeu o conceito de \ é o seguinte: alguns caracteres foram mapeados para serem caracteres especiais, fazer algo, não serem imprimidos na tela como o caso das " elas são feitas para terminar a string mas se você quiser imprimi-las você tem de mandar o C Ignorar a função que ela faz, com a barra invertida \ você mata a função das aspas e a faz em caractere comum ". Isso também vale para a própria barra, \\ Imprime uma barra invertida. e isso também tem valor invertido voce pode colocar a barra antes de caractere normal e dar a ele uma função especial como por exemplo o n O N é N uma letra mas se ele vim antes da barra ele pula uma linha \n assim como o T faz uma tabulação em vez de ser a T letra se vir antes da barra \t

    ResponderExcluir
  7. Excelente comentário Samuel, com certeza ajudará outros leitores.

    Quem quiser agregar, sintam-se à vontade, estamos aqui para compartilhar conhecimento mesmo.

    ResponderExcluir
  8. Comigo também não funcionou o aviso sonoro dos comandos "\7 \a".
    Estou usando o Codeblocks 12.11, com GCC, no Ubuntu 13.04.

    ResponderExcluir
  9. Muito bom este site. Estou no primeiro semestre de SI e recomendei o site a todos os alunos da sala. Muito bem elaborado e explicativo. Show.

    ResponderExcluir
  10. Danielle,

    Esse Beep sai dos speakers internos dos computadores, era aquele barulho que fazia quando iniciávamos um PC Desktop.

    No meu notebook realmente não saiu o beep, outras pessoas relatam o mesmo.

    Você pode testar a função Beep():

    #include
    #include

    #if !(WIN32)
    #define Beep(x,y) ( putchar('\a') )
    #endif

    int main()
    {
    Beep(523,500);
    return 0;
    }

    http://www.linuxforums.org/forum/programming-scripting/73363-beep-problem.html

    ResponderExcluir
  11. Na hora de "buildar" e rodar o programa (f9) aparece a seguinte mensagem dizendo que o arquivo .exe não foi criado:

    "It seems that this file has not been built yet.
    Do you want to build it now?"

    eu clico sim e nada a contece... come eu resolvo isso?

    ResponderExcluir
  12. Estou a começar hoje e estou a amar :) - já era uma paixão antiga!

    A título de curiosidade fui acrescentando instruções sem apagar o que tinha feito antes e o antivirus (avast) acusa malware quando:

    #include

    int main (void)
    {
    printf("%% \7 \7 \7 \a \a \a");
    getchar();
    return 0;
    }

    ResponderExcluir
  13. Excelente material, sou super iniciante e não entendia nada em outras apostilas, está de parabens.

    ResponderExcluir
  14. Não li todos os comentarios, mas se o som não está sendo executado é pq o pc pode estar sem o dispositivo. em alguns pc`s meus eu retirava.

    ResponderExcluir
  15. Nao sou novo nem expert na linguagem C. Mas gosto muito de programar, adorei esse site, vai me ajudar bastante...

    ResponderExcluir
  16. Estou adorando o curso. Comecei hoje.

    Uma dúvida:

    no código aviso sonoro, eu tentei assim e funcionou:

    # include
    int main (void)
    {
    printf ("\7 ");
    return 0;
    }

    Então qual a função do \a ???

    ResponderExcluir
  17. No meu programa não aparece a telinha preta, desde a primeira prgramação.

    ResponderExcluir
  18. Olá também comecei hoje e estou gostando muito do curso, desta oportunidade de aprendizado parabéns!
    o meu executa assim porém sem o som, mas deve ser como você explicou mais acima
    (linha em branco)
    Process returned 0 (0x0) execution time : 0.011 s
    Press ENTER to continue.

    então creio que tudo correndo liso, estou usando o GNU/Linux Ubuntu 14.04 lts com o codeblocks versão 13.12

    ResponderExcluir
  19. todos estão esquecendo o #include

    ResponderExcluir
  20. Brothers muito obrigado pelo trabalho bem feito! Estou usando muito os tutoriais de vcs desde que comecei a programar, o que não consigo aprender na facul de sistemas e no técnico de informática aprendo aqui com vcs! Vcs são D+ :)
    Muito obrigado mesmo!

    Até agora tudo rodando perfeito aqui!

    ResponderExcluir
  21. Desativem o avast meus amigos, eles só serve pra ocupar RAM mesmo :D

    ResponderExcluir
  22. Obrigada. Estou amando isso!

    Tudo saindo conforme ensinado.

    Beijos.

    ResponderExcluir
  23. Pessoal, quem não conseguiu executar o "beep sonoro" é problema de hardware, ou seja, o autofalante inserido na placa mãe está ausente. Invertam a polaridade caso encontre-o na placa mãe, caso não funcione teste-o com uma bateria de 9v para ter certeza que não está queimado. Depois baixem o manual da placa mãe e identifiquem os terminais positivo e negativo "speaker".
    Estou estudando a linguagem C para futuramente ingressar em integração de sistemas e processos automatizados.

    ResponderExcluir
  24. Excelente! Parabéns aos idealizadores do projeto.

    Quanto aos avisos sonoros, não sei por qual motivo, mais os avisos só foram emitidos apos fechar a tela do prompt do programa.

    ResponderExcluir
  25. eu digitei o comado
    #include

    int main(void)
    {
    printf("Antes do \\t \t Depois do \\t");
    return 0;
    }
    ele inicio mais não aconteceu nada só apareceu o console com a palavra escrita e mais nada que q houve?

    e também digitei

    #include

    int main(void)
    {
    printf("Carriage return: \r");
    getchar();
    return 0;
    }

    porem a unica coisa que aconteceu foi que eu podia escrever algo no console e dar enter, mas eu também podia dar enter sem digitar nada que que houve?

    ResponderExcluir
  26. Olá equipe do C progressivo! Eu serei um futuro Cientista da Computação e estou a adiantar alguma coisa da grade.
    Gostaria de parabenizar o projeto que é, com certeza, o melhor do gênero dentre todas as páginas da Web em português. Estou realmente maravilhado com tudo, principalmente a forma como tudo é exposto e passado de forma coloquial e direta! Mal consigo guarda minha excitação em avançar para as próximas aulas, mas tenho uma dúvida quanto a essa. Eu entendi tudo até agora e resolvi brincar um pouco e dessa brincadeira saiu esse código:

    #include

    int main(void)
    {

    printf("Fuck Amazing, i\'m instructing a machine!\n")
    printf("\7 \7 \7");
    getchar();
    return 0;

    }


    Mas quando eu dei Build o Code::Blocks acusou um erro na linha:

    printf("\7 \7 \7");

    Como arrisco um inglês digamos, modesto, percebi na Build messages que o programa estava me dizendo que era esperando um ; antes de printf("\7 \7 \7");
    Então eu acrescentei ; na frente da linha desta linha e dei Build com uma leve descrença e voilà! Funcionou! Nenhum erro!

    A minha questão é: o que fez com que um caractere aparentemente não tão substancial desse gargalo no código todo ("todo", eu sei que não é tão grande assim rsrsrs.) ? E qual a sua função nesse e outros casos ?

    ResponderExcluir
  27. Boa sou novo no assunto, quero mostrar primeiro o valor armazenado e depois o texto como fz?

    ResponderExcluir
  28. Criando sinais sonoros: Gostaria, se possível, que me explicasse o que produz o sinal sonoro, pois já experimentei de vários modos, ex: print("\7 \a"), conforme consta no tutorial e funcionou. Mas também funcionou com: print("\a"), com: print("\9 \a"), com: print("\1000 \a"), com: print("a\a"), ou seja, não dá para entender como funciona o código.

    ResponderExcluir
  29. Não estou conseguindo fazer nada.........

    ResponderExcluir
  30. Boa noite! Sou Jean Carlos da Conceição. Aluno de Ciências da Computação da Universidade do Estado da Bahia. Graduado em Pedagogia pela Faculdade Zacarias de Góes (FAZAG). Gostaria de parabenizar pelo excelente projeto de compartilhamento sobre Linguagem "C". Tenho me empenhado bastante tempo esses últimos dias. Quero que saibam que tem todo meu apoio e que os ajudarei a difundir esse trabalho lindo e espero que lucrem bastante e que tenham muito sucesso.

    Com certeza curtirei o canal. Já divulguei para meus colegas e pedi que os mesmos se inscrevessem. Do que depender de mim vocês não ganharam apenas mais um inscrito e sim um companheiro.

    Att. Jean Carlos da Conceição.

    ResponderExcluir
  31. sobre o comando carriage return ou \r, como posso utiliza-lo para que depois meu programa absorva o que foi escrito, ou dê um "scanf" naquela informação?

    ResponderExcluir
  32. Boa tarde. Estou com uma dúvida. Após o printf (digite um numero) eu não coloco nada e dou enter. Queria que aparecesse a mensagem "erro NÃO digitou nada". Mas invés disso fica esperando uma resposta. Como tratar esse Enter?

    ResponderExcluir
  33. Esse tutorial me ajudou demais

    ResponderExcluir
  34. não consegui exibir o "é", mesmo usando o /, ao invés disso aparece Ú e a barra some.

    ResponderExcluir

É quase impossível criar centenas de páginas voltadas para programação C e não cometer algum erro.

- Se notar algum conceito, letra ou trecho de código errado, deixe sua correção

- Se perceber uma maneira melhor ou mais eficiente de fazer algo, deixe sua ideia

- Se algo não ficar claro ou for confuso, nos avise

Aos poucos vamos aumentando e melhorando a qualidade de nosso material, e para isso contamos com sua ajuda.