Conversão de String para Int em C

1. Conversão de String para Int em C

william jussim
jussim

(usa Ubuntu)

Enviado em 12/10/2018 - 19:05h

Boa Noite, estou com uma grande dificuldade em trabalhar com o CPF em um atividade da faculdade.
Não consigo armazenar como int nem como float ou double, tentei armazenar como char e fazer o cast mas não estou conseguindo.
Alguem poderia me ajudar nesse ponto? como posso fazer para armazenar este cpf?


  


2. Re: Conversão de String para Int em C

Hugo Cerqueira
hrcerq

(usa Outra)

Enviado em 12/10/2018 - 22:43h

Olá.

O grande problema de armazenar o CPF em uma variável do tipo int está no fato de que o valor pode começar com zero (0). Nesses casos, esse zero será perdido e portanto o valor estará inconsistente.

Agora, quanto às questões de delimitadores citados pelo colega, eu discordo. Para isso, existem tratamentos. Quando você solicita ao usuário que digite um número de CPF, deve explicitamente dizer a ele que não inclua delimitadores e na função que recebe esses dados checar se o usuário atentou para esse pedido, solicitando que reinsira os dados, em caso negativo.

Ou ainda, pode simplesmente remover os delimitadores que o usuário inseriu antes de preencher a variável.

Qualquer valor numérico deve ser armazenado em variáveis numéricas sempre que possível. Valores inteiros ocupam menos espaço na memória que strings. Se você criar um vetor de char para armazenar um CPF, deverá reservar 15 posições (11 para os dígitos, 3 para os delimitadores e mais um para o caractere nulo). Isso equivale a 15 bytes (cada char equivale a 1 byte) em uma arquitetura x86-64. Em contrapartida, para armazenar esse mesmo valor em um inteiro, usará apenas 4 bytes.

---

Atenciosamente,
Hugo Cerqueira

Devuan - https://devuan.org/


3. Re: Conversão de String para Int em C

Hugo Cerqueira
hrcerq

(usa Outra)

Enviado em 12/10/2018 - 23:28h

SamL escreveu:

Se não me engano, por padrão um char tem um byte tanto em 32 bits quanto em 64 e armazenar 4 valores de um byte num int é bem chatinho.


Sim, o valor de 1 char corresponde a 1 byte. Mas para o CPF você precisaria de 15 bytes. Com um int, 4 bytes bastariam para armazenar a mesma informação (claro, considerando que o primeiro dígito não seja 0).

[...] Pra isso vai ter que usar deslocamento de bits do inteiro, fora que cada byte só armazena até o valor 255 (unsigned char) sendo que no CPF existem valores acima de 255 pra cada seção entre os pontos. Se quiser algo mais enxuto vai ter que usar vetor de todo jeito, no mínimo do tipo unsigned short int (2 bytes). Se usar string ele pode tratar melhor cada número, além de ser bem mais simples de se trabalhar apesar de não ser lá tão elegante.


Não vamos complicar o que não precisa ser complicado. Operações de bit a bit não são necessárias aqui e nem fariam sentido nesse caso.

A quantidade de dígitos entre cada ponto é irrelevante. O que é relevante é o número do CPF como um todo. Então eu poderia por exemplo criar a variável e atribuir o valor sem delimitadores. Por exemplo:

int cpf;
cpf = 11122233344;


O problema desta abordagem é que se o CPF começa com 0, o valor inteiro suprime o zero à esquerda. Assim, quando eu ler o valor da variável terei o valor incorreto, a menos que na leitura eu aplique um preenchimento com zeros, por exemplo:

printf("CPF: %011d\n",cpf); 


---

Atenciosamente,
Hugo Cerqueira

Devuan - https://devuan.org/


4. Re: Conversão de String para Int em C

Hugo Cerqueira
hrcerq

(usa Outra)

Enviado em 13/10/2018 - 00:06h

Tem razão, pra validar o CPF o formato int complica um pouco. Mas há uma abordagem que me parece mais "elegante", como você diz: no momento de validar o CPF, convertê-lo para string e aplicar um substring para pegar os dígitos verificadores e validar o resto. Assim, o CPF armazenado ocupa menos memória e somente no momento da validação usa-se um pouco mais de memória.

Talvez isso seja um exagero para uma tarefa de escola ou de faculdade. Mas penso que boas práticas tem que estar enraizadas na cabeça do programador.

---

Atenciosamente,
Hugo Cerqueira

Devuan - https://devuan.org/


5. Re: Conversão de String para Int em C

Hugo Cerqueira
hrcerq

(usa Outra)

Enviado em 13/10/2018 - 12:56h

SamL escreveu:

hrcerq escreveu:
Talvez isso seja um exagero para uma tarefa de escola ou de faculdade. Mas penso que boas práticas tem que estar enraizadas na cabeça do programador.

Sim tem razão, até hoje dez anos depois de começar estudar programação eu ainda tenho maus hábitos adquiridos lá no ínicio, apesar de que é bem reduzido em relação ao ínicio e meio desse período rsrsrs
Enfim, desculpa ai qualquer coisa.
____________________________________________
https://nerdki.blogspot.com/ acessa aí vai lá, é grátis!


Meu caro, não há por que pedir desculpas. Você expôs a sua visão de solução, eu expus a minha e com isso acho que apresentamos informações suficientes para ajudar o colega que fez a pergunta (espero). Opiniões diferentes são parte importante das discussões em forum.

---

Atenciosamente,
Hugo Cerqueira

Devuan - https://devuan.org/






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts