- 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"));
printf("%d\n", string2num("1234"));
printf("%d\n", string2num("4339") + 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
.
- Modifique a função
string2num
do exercício anterior
para converter strings contendo numerais escritos em qualquer base
entre 2 e 10.
A base 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.)