char
é usado para
representar caratereschar
guarda um
carater qualquer:char ch;
= 'A'; ch
'A' // letra A maiúscula
'a' // letra A minúscula
'?' // sinal de pontuação
' ' // espaço
'A' // 65
'a' // 97
' ' // 32
'0' // 48
int i;
char ch;
= 'a'; // i é 97
i = 65; // c é código de 'A'
ch = ch + 1; // c é código de 'B'
ch ++; // c é código de 'C' ch
A
e
Z
if ('A' <= ch && ch <= 'Z') ... |
✔ |
if (65 <= ch && ch <= 90) ... |
✘ |
\n |
mudança de linha | \b |
backspace |
\t |
tabulação horizontal | \\ |
contra-barra |
\' |
aspa simples | \a |
alert (campainha) |
char ch = '\n'; // mudança de linha
"%c"
para ler ou escrever
carateres usando scanf
e printf
char ch;
("%c", &ch); // ler um carater
scanf("%c", ch); // escrever um carater printf
#include <stdio.h>
int main(void)
{
char ch;
for (ch = 32; ch<127; ch++) {
if (ch % 8 == 0) {
("\n"); /* mudar de linha */
printf}
("%3d: %c ", ch, ch);
printf}
("\n");
printf}
32: 33: ! 34: " 35: # 36: $ 37: % 38: & 39: '
40: ( 41: ) 42: * 43: + 44: , 45: - 46: . 47: /
48: 0 49: 1 50: 2 51: 3 52: 4 53: 5 54: 6 55: 7
56: 8 57: 9 58: : 59: ; 60: < 61: = 62: > 63: ?
64: @ 65: A 66: B 67: C 68: D 69: E 70: F 71: G
72: H 73: I 74: J 75: K 76: L 77: M 78: N 79: O
80: P 81: Q 82: R 83: S 84: T 85: U 86: V 87: W
88: X 89: Y 90: Z 91: [ 92: \ 93: ] 94: ^ 95: _
96: ` 97: a 98: b 99: c 100: d 101: e 102: f 103: g
104: h 105: i 106: j 107: k 108: l 109: m 110: n 111: o
112: p 113: q 114: r 115: s 116: t 117: u 118: v 119: w
120: x 121: y 122: z 123: { 124: | 125: } 126: ~
Podemos usar scanf()
e printf()
para ler e
escrever carateres.
("%c", &ch); // ler um carater
scanf("%c", ch); // escrever um carater printf
Mas é mais comum usar as funções mais básicas:
= getchar(); // ler um carater
ch (ch); // escrever um carater putchar
Reservamos scanf()
e printf()
para
leitura e escrita formatada (e.g. números).
int getchar(void);
EOF
(end-of-file)
stdio.h
(tipicamente -1)int
e não um char
Contar o número de linhas na entrada padrão.
#include <stdio.h>
int main(void) {
int ch; // código de um carater
int lines = 0; // número de linhas
do {
= getchar(); // ler um carater
ch if(ch == '\n') // nova linha?
++;
lines } while(ch != EOF);
("%d linhas\n", lines);
printf}
Versão mais “idiomática”: leitura do próximo carater na condição do ciclo.
#include <stdio.h>
int main(void) {
int ch; // código de um carater
int lines = 0; // número de linhas
while ((ch=getchar()) != EOF) {
if(ch == '\n') // nova linha?
++;
lines}
("%d linhas\n", lines);
printf}
#include <ctype.h>
int islower(int ch); // letra minúscula a..z
int isupper(int ch); // letra maiúscula A..Z
int isalpha(int ch); // a..z ou A..Z
int isdigit(int ch); // algarimo decimal 0..9
int tolower(int ch); // converter em minúscula
int toupper(int ch); // converter em maiúscula
Atenção: apenas funcionam para ASCII simples — e.g. letras sem acentos.
<ctype.h>
isXXXXX(ch)
testam se o carater ch
pertence a uma classe
toXXXXX(ch)
transformam o carater ch
#include <stdio.h>
#include <ctype.h>
int main(void) {
int ch;
int letras = 0, algarismos = 0;
while((ch=getchar()) != EOF) {
if (isalpha(ch))
++;
letraselse if(isdigit(ch))
++;
algarismos}
("%d, %d\n", letras, algarismos);
printf}
switch
switch
Podemos usar uma sequência de if/else
para escolher
entre múltiplos casos:
if(nota == 4)
("Excelente");
printfelse if(nota == 3)
("Bom");
printfelse if(nota == 2)
("Razoável");
printfelse if(nota == 1)
("Fraco");
printfelse
("Nota inválida"); printf
switch
Em alternativa, podemos usar uma instrução switch
:
switch(nota) {
case 4: printf("Excelente");
break;
case 3: printf("Bom");
break;
case 2: printf("Razoável");
break;
case 1: printf("Fraco");
break;
default: printf("Nota inválida");
break;
}
switch
switch
pode ser mais
legível que a sequência if/else if
equivalenteswitch ( expressão ) {
case constante1: instruções
...
case constanteN: instruções
default: instruções
}
switch
int
, unsigned int
, long
,
char
float
,
double
) ou texto (strings)case
desde que sejam
constantes, e.g.case 33: ...
case 'A': ...
case (100-1)/2: ...
switch
case
segue-se uma sequência de
instruçõesbreak
case
não importa se colocarmos sempre o
break
switch
Podemos agrupar multiplos case
com uma só sequência de
instruções:
switch(nota) {
case 4:
case 3:
case 2: printf("Aprovado");
break;
case 1: printf("Reprovado");
break;
default: printf("Nota inválida");
break;
}
switch
Podemos escrever de forma mais sucinta juntando vários
case
.
switch(nota) {
case 4: case 3: case 2:
("Aprovado");
printfbreak;
case 1: printf("Reprovado");
break;
default: printf("Nota inválida");
break;
}
break
break
faz com que execução continue na instrução
seguinte ao switch
break
, a execução continua no caso
seguintebreak
switch(nota) {
case 4: printf("Excelente");
case 3: printf("Bom");
case 2: printf("Razoável");
case 1: printf("Fraco");
default: printf("Nota inválida");
}
Se a nota for 3, imprime
BomRazoávelFracoNota inválida
switch
para
distingir:
#include <stdio.h>
#include <ctype.h>
int main(void) {
int ch, vogais = 0, consoantes = 0;
while ((ch=getchar()) != EOF) {
= toupper(ch);
ch switch (ch) {
case 'A': case 'E':
case 'I': case 'O': case 'U':
++;
vogais break;
default:
if(isalpha(ch)) consoantes ++;
}
}
("%d, %d\n", vogais, consoantes);
printf}
$ cat texto2.txt
"To be or not to be; that is the question."
-- W. SHAKESPEARE
$ gcc -o letras letras.c
$ ./letras < texto2.txt
18 vogais, 24 consoantes