Ir ao conteúdo
  • Cadastre-se

C Qual problema desse código em C ?


lPaulo23

Posts recomendados

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Data{
    int Dia, Mes, Ano;
}Data;

typedef struct Cadastro{
    char Nome[30];
    Data Nasc;
    int CPF;
    char Sexo;
}Cadastro;

Cadastro cadastrarcliente();

int main (){
     int cont;
     Cadastro Cliente[3];

     cadastrarcliente(Cliente);

     for(cont = 0; cont < 3; cont++){
       printf("\n--------------------------------------\n");
       printf("\nOs dados do Cliente %i: ", cont);
       printf("\nNome   : %s",Cliente[cont].Nome);
       printf("\nData de Nascimento   xx/xx/xxxx: %i/%i/%i", Cliente[cont].Nasc.Dia, Cliente[cont].Nasc.Mes,Cliente[cont].Nasc.Ano);
       printf("\nInforme o CPF  : %d", Cliente[cont].CPF);
       printf("\nSexo M/F : %c", Cliente[cont].Sexo);
       printf("\n--------------------------------------\n");
    }

system ("pause");
return 0;
}

Cadastro cadastrarcliente(Cadastro Cliente[]){
    int cont;


    for(cont = 0; cont < 3; cont++){
       printf("\n--------------------------------------\n");
       printf("\nInforme os dados do Cliente %i: ", cont);
       printf("\nNome   : ");
       fflush(stdin);
       gets(Cliente[cont].Nome);
       printf("\nData de Nascimento   xx/xx/xxxx: ");
       scanf("%i/%i/%i", &Cliente[cont].Nasc.Dia, &Cliente[cont].Nasc.Mes, &Cliente[cont].Nasc.Ano);
       fflush(stdin);
       printf("\nInforme o CPF  : ");
       scanf("%d", &Cliente[cont].CPF);
       fflush(stdin);
       printf("\nSexo M/F :");
       scanf("%c", &Cliente[cont].Sexo);
       fflush(stdin);
       printf("\n--------------------------------------\n");
    }
}

Olá gente tudo bem? Estou cursando laboratório, essa é uma questão que utiliza função. Uma questão da lista que o professor passou. Alguém sabe me dizer qual o problema do meu código ? Na hora de imprimir cpf, ele corta o número zero, a mesma coisa na parte da data. O que fiz errado ou preciso consertar ? Tipo, se eu digito 025, ele imprimi 25, e não está imprimindo todos números do cpf. 

 

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

CPF tem uma regra clara de formação, dígitos verificadores e tal. Um int não é uma boa abstração... O compilador, como nós, sabe que zeros a esquerda são irrelevantes em números inteiros. CPF é outra parada. Use uma string, 11 dígitos. Mais simples.

Para referência, eis o valor de INT_MAX: +2147483647, o maior valor de int que foi como você declarou o CPF... Não vai dar certo. Se for insistir nisso, use

long int CPF; 

 

e crie uma solução para o zero a esquerda, usando %0d num sprintf() e depois inserindo o resto da pontuação como string...

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

7 horas atrás, arfneto disse:

CPF tem uma regra clara de formação, dígitos verificadores e tal. Um int não é uma boa abstração... O compilador, como nós, sabe que zeros a esquerda são irrelevantes em números inteiros. CPF é outra parada. Use uma string, 11 dígitos. Mais simples.

Para referência, eis o valor de INT_MAX: +2147483647, o maior valor de int que foi como você declarou o CPF... Não vai dar certo. Se for insistir nisso, use


long int CPF; 

 

e crie uma solução para o zero a esquerda, usando %0d num sprintf() e depois inserindo o resto da pontuação como string...

 

Como eu usaria no caso ? Tipo eu quero por com int, porque vou fazer a questão 9 que tem que criar 3 módulos, uma para validar nome, outra para validar cpf e outra para validar sexo. 

Quando coloco 11 dígitos com int, ele retorna 457, tá um bug estranho. Eu sou bem leigo em relação a algumas coisas. Eu coloquei long in cpf e continuou dando erro. E quando uso pelo lixux, ele pula o sexo, e vai direto para nome, mas do code e dev não acontece isso, como se o fflush(stdin); não tivesse servindo no linux. 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Acho que na verdade você não quer um int. Não vai operar com isso. Não vai somar CPF ou multiplicar ou nada.

 

Sugiro ler tudo como string e processar. Como em todo formulário online, você diz pro cara digitar o CPF no formato 123.456.789-01 e lê o valor e faz o que precisa com a string

 

Ou usa scanf() mesmo e a regra de formação do CPF. Afinal scanf() foi projetada para isso: scan fields. Qual a regra de formação do CPF em geral?

  • 3 dígitos
  • um ponto
  • 3 dígitos
  • um ponto
  • 3 dígitos
  • um traço
  • dois dígitos

Os dígitos verificadores são módulo 11 então já sabe como validar essa coisa e vai precisar dos dígitos em separado, lógico.
Então qual seria a máscara para scanf()?

 

"%3d%c%3d%c%3d%c%2d"

claro.

    int valor1, valor2, valor3, valor4;    // os numeros
    char d1, d2, d3; // os delimitadores
    int n;

    printf("Entre com o CPF no formato 012.345.678-90 e Tecle ENTER ao terminar\n");
    printf("\nCPF: ");

    n = scanf( "%3d%c%3d%c%3d%c%2d", &valor1, &d1, &valor2, &d2, &valor3, &d3, &valor4 );

E deve ter d1 e d2 = ponto e d3 = hifen se o cara digitou certo. E n = 7 lógico: 4 valores 3 delimitadores

E os números nos campos de valor. Use div e % para isolar os dígitos e fazer as contas para os dois dígitos verificadores e pronto...

 

Acha que precisa de um exemplo?

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

agora, arfneto disse:

Acho que na verdade você não quer um int. Não vai operar com isso. Não vai somar CPF ou multiplicar ou nada.

 

Sugiro ler tudo como string e processar. Como em todo formulário online, você diz pro cara digitar o CPF no formato 123.456.789-01 e lê o valor e faz o que precisa com a string

 

Ou usa scanf() mesmo e a regra de formação do CPF. Afinal scanf() foi projetada para isso: scan fields. Qual a regra de formação do CPF em geral?

  • 3 dígitos
  • um ponto
  • 3 dígitos
  • um ponto
  • 3 dígitos
  • um traço
  • dois dígitos

Os dígitos verificadores são módulo 11 então já sabe como validar essa coisa e vai precisar dos dígitos em separado, lógico.
Então qual seria a máscara para scanf()?

 


"%3d%c%3d%c%3d%c%2d"

claro.


    int valor1, valor2, valor3, valor4;    // os numeros
    char d1, d2, d3; // os delimitadores
    int n;

    printf("Entre com o CPF no formato 012.345.678-90 e Tecle ENTER ao terminar\n");
    printf("\nCPF: ");

    n = scanf( "%3d%c%3d%c%3d%c%2d", &valor1, &d1, &valor2, &d2, &valor3, &d3, &valor4 );

E deve ter d1 e d2 = ponto e d3 = hifen se o cara digitou certo. E n = 7 lógico: 4 valores 3 delimitadores

E os números nos campos de valor. Use div e % para isolar os dígitos e fazer as contas para os dois dígitos verificadores e pronto...

 

Acha que precisa de um exemplo?

 

 

Entendi, se puder dá um exemplo eu agraceço. Mas eu entendi com o exemplo que você usou aí em cima. E pra validar acredito que dá pra usar o (strlen) pra contar os caracteres. E a questão do linux. Que no lugar dele pedir pro usuário informar o sexo. Ele passa direto e vai pra nome. Sabe o que tenho que fazer ?

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

2 horas atrás, lPaulo23 disse:

E pra validar acredito que dá pra usar o (strlen) pra contar os caracteres

 

Não bastaria. E vai depender do que escreveu.

 

2 horas atrás, lPaulo23 disse:

E a questão do linux. Que no lugar dele pedir pro usuário informar o sexo. Ele passa direto e vai pra nome

 

Não há diferença entre os sistemas. fflush() é um inferno mesmo e em especial quando combinado com scanf(). scanf() é uma rotina ativa, digamos, e tem suas regras para consumir a entrada e pode acabar "comendo" coisas.  Sugiro esquecer isso e ler até o \n. Explicitamente. Ou colocar um %c no final de qualquer scanf() para forçar a consumir o \n.

 

Como cada sistema tem seu padrão de buffer para a entrada às vezes o comportamento dessas rotinas difere de sistema para sistema.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

agora, arfneto disse:

 

Não bastaria. E vai depender do que escreveu.

 

 

Não há diferença entre os sistemas. fflush() é um inferno mesmo e em especial quando combinado com scanf(). scanf() é uma rotina ativa, digamos, e tem suas regras para consumir a entrada e pode acabar "comendo" coisas.  Sugiro esquecer isso e ler até o \n. Explicitamente. Ou colocar um %c no final de qualquer scanf() para forçar a consumir o \n.

 

Como cada sistema tem seu padrão de buffer para a entrada às vezes o comportamento dessas rotinas difere de sistema para sistema.

Entendi, muito obrigado pela ajuda. Vou tentar fazer aqui dessa forma. 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Postei um programa aqui um dia desses que ilustra melhor essas coisas com scanf().

 

scanf() é uma função sensacional mas foi escrita com um propósito bem diferente e muito mais amplo do que aparentemente se vê e tenta usar nesses cursos hoje em dia.

 

Entendeu o que significa ser uma rotina ativa quando eu escrevi? scanf() sai lendo e descartando coisas se você não entender o que está escrevendo e o cara que está digitando não cooperar e entrar com qualquer m#$da.

 

scanf() "consome" coisas até satisfazer a máscara de entrada, aquela string do formato. Isso pode incluir linhas inteiras, outros campos, o lanche da tarde, qualquer coisa.

 

Por essa razão muitas vezes se lê tudo como caracter, string, e faz o "scanf()" no programa.

 

veja essa saída

Entre com 2 numeros separados por espaco ou TAB virgula ou sei la
Tecle ENTER ao terminar

Valores: -45.545, 23.45

scanf() leu 4 itens

scanf()     valor1 = -45.545000
no meio veio algo com codigo 44 = ','
scanf()     valor2 = 23.450000
no final foi um fim de linha \n

Rode em sua maquina e vai te ajudar muito a entender como esse trem funciona

#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "string.h"


int main(int artgc, char** argv)
{
	int			n;
	char		meio, fim;			// os dois delimitadores
	double		valor1, valor2;		// os dois numeros
	char		v[80];
	char* p = v;


	printf("Entre com 2 numeros separados por espaco ou TAB virgula ou sei la\n");
	printf("Tecle ENTER ao terminar\n");
	printf("\nValores: ");
	n = scanf("%lf%c%lf%c", &valor1, &meio, &valor2, &fim);

	// o que leu?
	printf("\nscanf() leu %d itens\n\n", n);

	// o primeiro
	printf("scanf()     valor1 = %lf\n", valor1);

	// o que tinha entre oa dois
	switch (meio)
	{
	case '\t':
		printf("no meio foi um TAB\n");
		break;
	case ' ':
		printf("no meio foi um espaco\n");
		break;
	default:
		printf("no meio veio algo com codigo %d = '%c'\n", meio, meio);
		break;
	}	// switch

	// o segundo
	printf("scanf()     valor2 = %lf\n", valor2);

	// como terminou
	switch (fim)
	{
	case EOF:
		printf("fim de arquivo no final\n");
		break;
	case '\t':
		printf("no final foi um TAB\n");
		break;
	case '\n':
		printf("no final foi um fim de linha \\n \n");
		break;
	case ' ':
		printf("no final foi um espaco\n");
		break;
	default:
		printf("no final veio algo com codigo %d = '%c'\n", fim, fim);
		break;
	}	// switch

}

Repito: rode isso em sua maquina e atente para a máscara de scanf()

 

Você sabe usar funções em C?

adicionado 6 minutos depois

Nesse caso o scanf() era

	n = scanf("%lf%c%lf%c", &valor1, &meio, &valor2, &fim);

Então scanf() consome a entrada até se satisfazer com um decimal,  float, algo no meio, que pode ser enorme, outro float e algo mais que tenha uma letra, que pode ser algo bem grande que vai sumir. Mas nesse caso fica tudo certinho, porque o que nós queremos é ler os dois números e pronto. E o cara pode digitar o normal 1,2<ENTER> ou qualquer coisa e a rotina sobrevive sem gastar além da conta.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

7 horas atrás, arfneto disse:

Postei um programa aqui um dia desses que ilustra melhor essas coisas com scanf().

 

scanf() é uma função sensacional mas foi escrita com um propósito bem diferente e muito mais amplo do que aparentemente se vê e tenta usar nesses cursos hoje em dia.

 

Entendeu o que significa ser uma rotina ativa quando eu escrevi? scanf() sai lendo e descartando coisas se você não entender o que está escrevendo e o cara que está digitando não cooperar e entrar com qualquer m#$da.

 

scanf() "consome" coisas até satisfazer a máscara de entrada, aquela string do formato. Isso pode incluir linhas inteiras, outros campos, o lanche da tarde, qualquer coisa.

 

Por essa razão muitas vezes se lê tudo como caracter, string, e faz o "scanf()" no programa.

 

veja essa saída


Entre com 2 numeros separados por espaco ou TAB virgula ou sei la
Tecle ENTER ao terminar

Valores: -45.545, 23.45

scanf() leu 4 itens

scanf()     valor1 = -45.545000
no meio veio algo com codigo 44 = ','
scanf()     valor2 = 23.450000
no final foi um fim de linha \n

Rode em sua maquina e vai te ajudar muito a entender como esse trem funciona


#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "string.h"


int main(int artgc, char** argv)
{
	int			n;
	char		meio, fim;			// os dois delimitadores
	double		valor1, valor2;		// os dois numeros
	char		v[80];
	char* p = v;


	printf("Entre com 2 numeros separados por espaco ou TAB virgula ou sei la\n");
	printf("Tecle ENTER ao terminar\n");
	printf("\nValores: ");
	n = scanf("%lf%c%lf%c", &valor1, &meio, &valor2, &fim);

	// o que leu?
	printf("\nscanf() leu %d itens\n\n", n);

	// o primeiro
	printf("scanf()     valor1 = %lf\n", valor1);

	// o que tinha entre oa dois
	switch (meio)
	{
	case '\t':
		printf("no meio foi um TAB\n");
		break;
	case ' ':
		printf("no meio foi um espaco\n");
		break;
	default:
		printf("no meio veio algo com codigo %d = '%c'\n", meio, meio);
		break;
	}	// switch

	// o segundo
	printf("scanf()     valor2 = %lf\n", valor2);

	// como terminou
	switch (fim)
	{
	case EOF:
		printf("fim de arquivo no final\n");
		break;
	case '\t':
		printf("no final foi um TAB\n");
		break;
	case '\n':
		printf("no final foi um fim de linha \\n \n");
		break;
	case ' ':
		printf("no final foi um espaco\n");
		break;
	default:
		printf("no final veio algo com codigo %d = '%c'\n", fim, fim);
		break;
	}	// switch

}

Repito: rode isso em sua maquina e atente para a máscara de scanf()

 

Você sabe usar funções em C?

adicionado 6 minutos depois

Nesse caso o scanf() era


	n = scanf("%lf%c%lf%c", &valor1, &meio, &valor2, &fim);

Então scanf() consome a entrada até se satisfazer com um decimal,  float, algo no meio, que pode ser enorme, outro float e algo mais que tenha uma letra, que pode ser algo bem grande que vai sumir. Mas nesse caso fica tudo certinho, porque o que nós queremos é ler os dois números e pronto. E o cara pode digitar o normal 1,2<ENTER> ou qualquer coisa e a rotina sobrevive sem gastar além da conta.

Bem legal esse código, eu estou engatilhando, não sei muita coisa. Já passei por lógica de programação que foi no primeiro semestre. Agora tô pegando laboratório que era pra eu pegar no segundo mas deixei passar porque passei raspando em lógica, pra ver se eu estudava mais. Mas ainda sim estou bem fraco. Funções estou aprendendo nesse semestre. Começou recentemente, aí até agora não passou disso. Modularização! 

adicionado 0 minutos depois

@arfneto Muito obrigado pela ajuda! Vou analisar tudo com calma e tentar melhorar meu código. 

adicionado 13 minutos depois
10 horas atrás, lPaulo23 disse:

Entendi, se puder dá um exemplo eu agraceço. Mas eu entendi com o exemplo que você usou aí em cima. E pra validar acredito que dá pra usar o (strlen) pra contar os caracteres. E a questão do linux. Que no lugar dele pedir pro usuário informar o sexo. Ele passa direto e vai pra nome. Sabe o que tenho que fazer ?

Eu não entendi muito bem essa parte "E os números nos campos de valor. Use div e % para isolar os dígitos e fazer as contas para os dois dígitos verificadores e pronto..."

adicionado 17 minutos depois

@arfneto Mas penso em fazer com string mesmo o CPF pra validar depois, mas saber outras formas sempre é bom. Dessa forma que você falou o 0 do lado esquerdo não seria ignorado ? 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

1 hora atrás, lPaulo23 disse:

Bem legal esse código, eu estou engatilhando, não sei muita coisa. Já passei por lógica de programação que foi no primeiro semestre. Agora tô pegando laboratório que era pra eu pegar no segundo mas deixei passar porque passei raspando em lógica, pra ver se eu estudava mais

 

Você rodou isso em sua máquina? 

 

Entendeu o que eu queria dizer sobre scanf() ser "ativa"? 

 

Citação

Em geral quando scanf() pula um valor por exemplo o problema está num scanf() anterior mal formulado que comeu valores de modo inesperado....

 

Sério, se não rodou esse programa que te mostrei E não entendeu isso não continue. Insista até entender. Pergunte de novo.

Esse programa exemplo mostra o %c no final do scanf() que vai consumir --- scan --- tudo que tiver até o enter e vai colocar algo na variável 

char fim; 

que não serve pra nada exceto isso: garantia. Assim o próximo scanf() começa de onde você imaginava. Eu gostaria muito de ter lido um programa desses quando comecei a usar essa função. Não vejo isso na documentação ou nos livros-texto. Parece que os autores não enfatizam de modo algum essa parada de scan do scanf()...

 

Sobre funções

Funçoes são blocos de código com um nome. Mas com algo mais: você pode passar argumentos e retornar um resultado, então pode reutilizar indefinidamente. A diferença entre a função printf() e uma função x() que você escreveu é só essa: você escreveu a segunda e só está usando a primeira, que alguém escreveu e deixou em algum lugar onde você pode usar.

 

Sobre o CPF

Vou te mostrar um exemplo sobre o CPF sem usar funções, para você poder testar com mais facilidade.

 

Citação

Vou fazer isso porque entendi que você está tentando fazer e não esperando uma solução de alguém, o que não teria nada de mais se você estivesse pagando: se chamaria então consultoria.

 

Na prática você criaria uma função para verificar os dígitos verificadores e a formação e tal.

 

Resultado da execucão do programa de exemplo para o CPF 123.456.789-09, válido
 

CPF: 123.456.789-09

scanf() leu 7 itens
scanf()     valor1 = 123
scanf()     valor2 = 456
scanf()     valor3 = 789
scanf()     valor4 = 09
scanf()     delimitador 1 = [.]
scanf()     delimitador 2 = [.]
scanf()     delimitador 3 = [-]

CPF lido 123.456.789-09
Digito a Digito: 1 2 3 4 5 6 7 8 9 0 9

DV calculados: 0 9
CPF valido

Esse programa lê um CPF usando a máscara de que falei ---  %3d%c%3d%c%3d%c%2d --- com  4 grupos de números e 3 delimitadores. Se espera que venha algo tipo 1.2.3-04 que pode até ser válido. No retorno de scanf() ela deve ter lido 4+3=7 valores, claro. E você pode testar cada um.

 

 

Teste o programa mudando os dígitos finais e o CPF e vai entender o resto 

 

Eis o programa

#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "string.h"


int main(int argc, char** argv)
{
	int valor1, valor2, valor3, valor4;	// os numeros
	char d1, d2, d3; // os delimitadores
	int n;
	int soma, i;  // para calculo dos DV 123.456.789-09 OK

	printf("Entre com o CPF no formato 012.345.678-90 e Tecle ENTER ao terminar\n");
	printf("\nCPF: ");

	n = scanf( "%3d%c%3d%c%3d%c%2d", &valor1, &d1, &valor2, &d2, &valor3, &d3, &valor4 );

	// o que leu?
	printf("\nscanf() leu %d itens\n", n);

	// os valores
	printf("scanf()     valor1 = %03d\n", valor1);
	printf("scanf()     valor2 = %03d\n", valor2);
	printf("scanf()     valor3 = %03d\n", valor3);
	printf("scanf()     valor4 = %02d\n", valor4);

	// os delimitadores
	printf("scanf()     delimitador 1 = [%c]\n", d1);
	printf("scanf()     delimitador 2 = [%c]\n", d2);
	printf("scanf()     delimitador 3 = [%c]\n", d3);

	// mostra os valores afinal
	printf("\nCPF lido %03d.%03d.%03d-%02d\n", valor1, valor2, valor3, valor4);

	// aqui vão os digitos 1 a 1 para calcular os DV
	int digito[11] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

	digito[0] =  valor1 / 100;
	digito[1] = (valor1 % 100) / 10;
	digito[2] =  valor1 % 10;

	digito[3] =  valor2 / 100;
	digito[4] = (valor2 % 100) / 10;
	digito[5] =  valor2 % 10;

	digito[6] =  valor3 / 100;
	digito[7] = (valor3 % 100) / 10;
	digito[8] =  valor3 % 10;

	digito[ 9] = valor4 / 10;
	digito[10] = valor4 % 10;


	printf("Digito a Digito: ");
	for (i = 0; i < 11; i = i + 1)
	{
		printf("%d ", digito[i]);
	}
	printf("\n");

	/////////////////////////////////////////////////////////// DV 1

	// o primeiro digito verificador, modulo 11 dos 9
	soma = 0;
	for (i = 0; i < 9; i = i + 1)
		soma = soma + digito[i] * (10-i); // 10..2

	// essa e a conta que da nome ao processo
	soma = soma % 11;
	if (soma > 1)
		digito[9] = 11 - soma;
	else
		digito[9] = 0;

	/////////////////////////////////////////////////////////// DV 2

	// o segundo DV, modulo 11 dos 10
	soma = 0;
	for (i = 0; i < 10; i = i + 1)
		soma = soma + digito[i] * (11 - i); // 11..2

	// essa e a conta que da nome ao processo
	soma = soma % 11;
	if (soma > 1)
		digito[10] = 11 - soma;
	else
		digito[10] = 0;


	printf("\nDV calculados: %d %d\n", digito[9], digito[10]);

	// compara os digitos
	int dv1ok = digito[9] == (valor4 / 10);
	int dv2ok = digito[10] == (valor4 % 10);

	if (dv1ok && dv2ok)
	{
		printf("CPF valido\n");
	}
	else
	{
		if (!dv1ok) printf("DV1 'devia ser %d. Lido %d\n", digito[9], (valor4 / 10));
		if (!dv2ok) printf("DV2 'devia ser %d. Lido %d\n", digito[10], (valor4 % 10));
		printf("CPF INVALIDO\n");
	};	// if
}	// main

 

Escrevi de maneira bem linear e até redundante. Espero que dê para entender. Linear:

  • lê os valores.
  • Confirma o formato.
  • Calcula os dígitos verificadores
  • Compara
  • Mostra o resultado
  • Game Over

 

Como testar um CPF?

Simples demais. Primeiro o formato, com if. Os valores devem ser 3 números entre 1 e 999 e um numero entre 00 e 99 que são os tais dígitos verificadores. E os delimitadores? Se espera que sejam ponto, ponto e traço nessa ordem. E são d1, d2 e d3 no programa de exemplo. Veja lá. Só isso. Se falhar algo você rejeita o CPF como mal formado. E os DV? Simples mas um pouco chato: a receita federal usa uma norma de décadas atrás, conhecida como módulo 11 e acho mais fácil ler o código que eu explicar a toa. Se não entender, pergunte. Mas é bem simples.

 

O que fazer então? 

Se o número está bem formado, com os números certinhos e os delimitadores esperados, você confere os dois dígitos verificadores e se bater um e outro está ok: tem um CPF válido e confirmado.

Espero que ajude a entender.  Continue perguntando.

 

adicionado 8 minutos depois
2 horas atrás, lPaulo23 disse:

 Dessa forma que você falou o 0 do lado esquerdo não seria ignorado

 

Usando scanf() você tem 4 números e pronto. Na hora de imprimir use %03d para cada grupo e o printf() coloca os zeros a esquerda se for o caso... e %02d para os dígitos verificadores porque podem ser até 00. Vai ver isso no programa que eu escrevi. Teste.

 

Tem um milhão de maneiras de fazer isso. Essa que te mostrei é bem clássica para escrever em C. Usar string seria outra. Mas na hora de calcular os DV essa técnica que eu usei é mais simples.

 

Para 100% de compatibilidade: acho que a receita federal diz que os 9 dígitos não podem ser iguais. Não tenho certeza. Minha lembrança disso vem de épocas bem distantes :( . O primeiro dígito de meu CPF é aquele que preocupa você: zero mesmo. Então teria que rejeitar um CPF se os 3 grupos tivessem o mesmo valor, tipo 111 ou 222. Deve estar em uma instrução normativa da SRF imagino. :D Mas já está bem para o forum assim. 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

12 horas atrás, lPaulo23 disse:

Eu não entendi muito bem essa parte "E os números nos campos de valor. Use div e % para isolar os dígitos e fazer as contas para os dois dígitos verificadores e pronto..."

 

Lendo o programa de exemplo agora acho que vai entender. Ou pergunte de novo e te mostro no programa onde usa isso

Link para o comentário
Compartilhar em outros sites

22 horas atrás, arfneto disse:

essa técnica que eu usei é mais simples

É mais simples porque nesse caso você vai usar os campos como números, para calcular os dígitos verificadores e ver se o CPF digitado é válido afinal. Se fosse tudo string isso ficaria um pouco diferente.

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...