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

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;
}

26 comentários:

paulo garcia disse...

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

Rodrigo disse...

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.

Renato Souza disse...

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?

Will Sales disse...

Renato você esqueceu de inserir a biblioteca no include #include



Apostila de C disse...

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.

Samuel disse...

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

Apostila C Progressivo disse...

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

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

Danielle Farias disse...
Este comentário foi removido pelo autor.
Danielle Farias disse...

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.

Reinaldo disse...

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.

Apostila C Progressivo disse...

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

Douglas disse...

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?

MB disse...

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;
}

Anônimo disse...

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

Anônimo disse...

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.

Luiz Carlos disse...

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

Juliana Moraes Lacerda disse...

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 ???

Ju Antico disse...

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

Marivaldo Cordeiro disse...

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

Anônimo disse...

todos estão esquecendo o #include

Diego Fortunatto disse...

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!

Anônimo disse...

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

Unknown disse...

Obrigada. Estou amando isso!

Tudo saindo conforme ensinado.

Beijos.

Markos NuNes disse...

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.

Jean Clecio disse...

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.

Anônimo disse...

Muito bom!

Gostou desse tutorial de C?
Sabia que o acervo do portal C Progressivo é o mesmo, ou maior que, de um livro ou curso presencial?
E o melhor: totalmente gratuito.

Mas para nosso projeto se manter é preciso divulgação.
Para isso, basta curtir nossa página no Facebook e/ou clicar no botão +1 do Google.
Contamos e precisamos de seu apoio.