- Compile e execute o seguinte programa:
#include <ctype.h>
#include <stdio.h>
int string2num (char *s) {
int a = 0;
for (; *s; s++)
a = a*10 + (*s - '0');
return a;
}
int main (void) {
printf("==> %d\n", string2num("234") + 1);
printf("==> %d\n", string2num("1234"));
printf("==> %d\n", string2num("4339") + string2num("1"));
return 0;
}
Para compilá-lo, salve o programa em um arquivo aula1.c
e execute o comando abaixo:
gcc -Wall -o aula1 aula1.c
Para executar o resultado, chame ./aula1.
(A opção -Wall diz ao gcc para gerar warnings
e o argumento -o aula1 o instrui a colocar o programa
executável no arquivo aula1.)
Procure entender como funciona a função string2num.
(Mande imprimir o valor de a a cada iteração
do for. O que está acontecendo?
O que será o valor de (*s - '0') a
cada iteração?)
- Modifique a função
string2num do exercício anterior
para converter strings contendo numerais escritos em qualquer base
entre 2 e 10.
A base em que o numeral está escrito
deverá ser dada como um segundo parâmetro (do tipo int)
para a função.
Teste sua função com as chamadas abaixo:
printf("%d\n", string2num("17", 8));
printf("%d\n", string2num("777", 8));
printf("%d\n", string2num("777", 10));
printf("%d\n", string2num("777", 9));
- Modifique novamente a função
string2num para aceitar
bases maiores que 10.
Nesse caso, precisamos de "dígitos" para os valores a partir de 10.
É convencional usarmos as letras A-Z (e/ou a-z)
para isso, com A representando o "dígito" 10 e assim
por diante, até Z representando o "dígito" 35.
(Qual a maior base que podemos usar com esse esquema?)
Teste sua função com as chamadas abaixo:
printf("%d\n", string2num("1a", 16));
printf("%d\n", string2num("ff", 16));
printf("%d\n", string2num("a09b", 16));
printf("%d\n", string2num("ffff", 16));
printf("%d\n", string2num("z09b", 36));
(Dica: talvez as funções isdigit e isalpha
possam ser úteis.
Use o comando man para ver a sua descrição.)
- (Extra)
Escreva a função inversa do ítem anterior,
para converter um número para uma string.
A função deve receber um ponteiro para um buffer onde escreverá o resultado,
o número a ser convertido e a base para a conversão.
Para simplificar,
assuma que o buffer tem tamanho suficiente para guardar todo o resultado.
(Essa simplificação é uma péssima prática de programação em C;
depois pense em como corrigí-la.)