Você está na página 1de 2

Faculdade de Tecnologia SENAI Anchieta

Pós-Graduação em Sistemas Embarcados

Aluno: Jonnes Ferreira do Nascimento

LIP – Atividade 1: Funções StrToInt e IntToStr em C

Enunciado:

DESENVOLVA UMA FUNÇÃO EM LINGUAGEM C RESPONSÁVEL EM CONVERTER UMA


VARIÁVEL INT PARA STRING E DE STRING PARA INT, CONFORME A SINTAXE A
SEGUIR:

OBSERVAÇÃO: CONSIDERE INT DE 16 BITS;

SINTAXE DE EXEMPLO:

- void IntToStr( int num, char * str );


- void StrToInt( char * str, int * num );

Solução:
#include <stdio.h>
#include <math.h>

#define uint8_t unsigned char


#define int16_t short int

const uint8_t MAX_DIGITS = 7; /* (1 - sinal) + (5 digitos) + (1 - terminadar de


string) */
const uint8_t CHAR_0_ASCII_CODE = 48; /* ASCII: '0' = 48 .. '9' = 57 */

void IntToStr(int16_t num, char * str);


void StrToInt(char * str, int16_t * num);

int main() {
char string[MAX_DIGITS];
int16_t inteiro;

IntToStr(21, string);
printf("Value of string: %s, address: %lu\n", string, string);

StrToInt("-1234", &inteiro);
printf("Value of integer: %d\n", inteiro);

return 0;
}

void IntToStr(int16_t num, char * str) {


// se for menor que zero, adiciona o sinal a string
if (num < 0) {
num *= -1;
*str = '-';
str++;
}

int16_t base;
uint8_t division;

/* calcula o peso de cada um dos digitos */


for(uint8_t i = 4; i > 0; i--) {
base = (int16_t) pow(10, i); /* o peso de cada divisao e uma potencia de base 10
*/
division = (uint8_t) (num / pow(10, i)); /* divide o numero pela base da vez */

/*
* caso o resultado da divisao seja maior que zero, adiciona o caracter ascii
correspondente
* e subtrai o produto da divisao pela base da vez, do numero
*/
if (division > 0) {
*str = division + CHAR_0_ASCII_CODE;
str++;

num -= division * base;


}
}

/* adiciona o 'resto' a string */


*str = num + CHAR_0_ASCII_CODE;
str++;

/* adiciona o terminador de string */


*str = '\0';
}

void StrToInt(char * str, int16_t * num) {


uint8_t digitCount = 0;
uint8_t negative = 0;

/* inicializa a variavel destino */


*num = 0;

/* verifica quantos digitos tem a string informada */


while(*str != '\0') {
/*
* verifica se o numero passado na string e negativo.
* se for, marca o flag como 'true', avança o ponteiro str
* e nao soma o contador de digitos
* */
if(*str == '-') {
negative = 1;
} else {
digitCount++;
}

str++;
}

/* volta uma posicao no ponteiro para evitar o terminador de string */


str--;

/* soma o digito das unidades */


*num += (*str - CHAR_0_ASCII_CODE);
str--;

/* calcula o valor de cada digito, baseado na posicao do digito */


for(uint8_t i = 1; i < digitCount; i++) {
*num += (*str - CHAR_0_ASCII_CODE) * (int16_t)pow(10, i);
str--;
}

/* se negativo, multiplica o resultado por -1 */


if(negative) {
*num *= -1;
}
}

Você também pode gostar