Enviar um café pro programador

Pode me ajudar a transformar cafeína em código?

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:

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

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

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

Unknown disse...

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

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

Unknown disse...

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

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

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

Arthur disse...

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?

Unknown disse...

Vou testa

Unknown disse...

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 ?

Unknown disse...

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

Anônimo disse...

Muito bom!

Unknown disse...

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.

Anônimo disse...

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

Unknown disse...

Vlw me ajudou bastante 🙂!!!

Unknown disse...

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.

Unknown disse...

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?

Mauricio Soto disse...

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?

tg disse...

Minha dúvida era mesmo essa

Anônimo disse...

Esse tutorial me ajudou demais

Anônimo disse...

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