Podemos usar scanf() e printf() para ler e escrever carateres.
scanf("%c", &ch); // ler um carater
printf("%c", ch); // escrever um caraterMas é mais comum usar as funções mais básicas:
ch = getchar(); // ler um carater
putchar(ch); // escrever um caraterReservamos 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 charContar 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 {
ch = getchar(); // ler um carater
if(ch == '\n') // nova linha?
lines ++;
} while(ch != EOF);
printf("%d linhas\n", lines);
}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++;
}
printf("%d linhas\n", lines);
}#include <stdio.h>
/* Rodar 13 posições as letras A-Z */
int rot13(int ch) {
if(ch >= 'A' && ch <= 'Z')
ch = ((ch - 'A' + 13) % 26) + 'A';
return ch;
}
int main(void) {
int ch;
while ((ch=getchar()) != EOF)
putchar(rot13(ch));
}$ cat texto.txt
"TO BE OR NOT TO BE; THAT IS THE QUESTION"
-- W. SHAKESPEARE
$ gcc -o rot13 rot13.c
$ ./rot13 < texto.txt > rodado.txt
$ cat rodado.txt
"GB OR BE ABG GB OR; GUNG VF GUR DHRFGVBA"
-- J. FUNXRFCRNER
$ ./rot13 < rodado.txt
"TO BE OR NOT TO BE; THAT IS THE QUESTION"
-- W. SHAKESPEARE
#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úsculaAtençã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))
letras++;
else if(isdigit(ch))
algarismos++;
}
printf("%d, %d\n", letras, algarismos);
}switchswitchPodemos usar uma sequência de if/else para escolher entre múltiplos casos:
if(nota == 4)
printf("Excelente");
else if(nota == 3)
printf("Bom");
else if(nota == 2)
printf("Razoável");
else if(nota == 1)
printf("Fraco");
else
printf("Nota inválida");switchEm 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;
}switchswitch pode ser mais legível que a sequência if/else if equivalente switch ( expressão ) {
case constante1: instruções
...
case constanteN: instruções
default: instruções
}switchint, unsigned int, long, charfloat, double) ou texto (strings)case desde que sejam constantes, e.g. case 33: ...
case 'A': ...
case (100-1)/2: ...switchcase segue-se uma sequência de instruçõesbreakcase não importa se colocarmos sempre o breakswitchPodemos 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;
}switchPodemos escrever de forma mais sucinta juntando vários case.
switch(nota) {
case 4: case 3: case 2:
printf("Aprovado");
break;
case 1: printf("Reprovado");
break;
default: printf("Nota inválida");
break;
}breakbreak faz com que execução continue na instrução seguinte ao switchbreak, a execução continua no caso seguintebreakswitch(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) {
ch = toupper(ch);
switch (ch) {
case 'A': case 'E':
case 'I': case 'O': case 'U':
vogais ++;
break;
default:
if(isalpha(ch)) consoantes ++;
}
}
printf("%d, %d\n", vogais, consoantes);
}$ 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