Ir ao conteúdo

Posts recomendados

Postado

Olá, estou fazendo um validador de cpf, a primeira parte consiste em multiplicar cada número pela sua posição (ex=123456789 - 1x10 -2x9...), coloquei o número numa string, mas quando faço os calculos sempre dá o número que eu insiro(estou testando só com um número +48*10, segue o código:

 

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

int main(){
  int mult1=0,mult2=0,n=10;
 char cpf[11];
 printf("Digite seu cpf no formato(XXXXXXXXXXX)");
 fgets(cpf,11,stdin);
  for(int i=0;i<1;i++){
    mult1+=(cpf[i]*n);
    n--;
}
printf("%d", mult1);

return(0);
}

 

 

Postado

Não entendi muito bem o que você quis dizer. Como assim "só com um número +48*10".

Se não me engano, precisa deixar 1 espaço a mais para o vetor de char, para guardar o '\0'.

Postado

No seu programa

cpf[i]

é um caractere.

 

 

Uma variável char é um inteiro com 8 bits = 1 byte, e existem tabelas que associam este número a um caractere. Por exemplo o número 49 é o número que corresponde ao caractere '1'.

 

Logo:

#include <stdio.h>

int main(){
    char c1, c2;
    
    c1 = 49;
    c2 = '1';
    if (c1 == c2){
        printf("Os valores de c1 e c2 sao iguais, veja:\n\n c1  c2\n %d  %d\n  %c   %c\n", c1, c2, c1, c2);
    }
}

 

Uma maneira de converter o caractere para o número correspondente correto seria subtrair o caractere '0', veja:

 

char c = '1';
printf("%d", c - '0'); //Imprime o número inteiro 1

Pois o caractere '0' corresponde ao número 48, mas desta maneira você não precisa saber qual o número correspondente, apenas saber que subtraindo '0' do dígito do número resultara no número inteiro correspondente.

 

E para saber se é um caractere é um número basta verificar se (caractere >= '0') e (caractere <= '9').

 

Isso é útil para o alfabeto também, se você deseja obter um número entre 0 e 25 com as letras minúsculas, basta subtrair 'a' da letra, e para letras maiúsculas subtrai 'A'. E checa se é uma letra usando os intervalos ['a' até 'z'] e ['A' até 'Z'].

Postado

tentei subtrair pelo '0' e agr se eu boto o número como entrada, resultado 308, 2-318, 3-328... O resultado deveria ser 10, pois a multiplicação, na teoria, é 1*10.

 

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

int main(){
  int mult1=0,mult2=0,n=10;
 char cpf[11];
 printf("Digite seu cpf no formato(XXXXXXXXXXX)");
 fgets(cpf,11,stdin);
  for(int i=0;i<9;i++){
    mult1+=(cpf[i]*n);
    n--;
}
printf("%d", mult1-'0');


return(0);
}

 

Postado

O problema está na hora de fazer a multiplicação não na hora de imprimir... (Aliás "multi" é um int não um char, não tem porque subtrair '0' ali.)

Postado

tentei usar a atoi pra passar esses numero para um vetor :

 

 int vet[11],i;
 char cpf[11];
 printf("Digite seu cpf no formato(XXXXXXXXXXX)");
 fgets(cpf,11,stdin);
 for(i=0;i<11;i++){
   vet[i]= atoi(cpf[i]);

 }

mas recebo o erro:

In function main’:
testae.c:10:17: warning: passing argument 1 of atoi makes pointer from integer without a cast [-Wint-conversion]
    vet[i]= atoi(cpf[i]);
                 ^~~
In file included from testae.c:1:0:
/usr/include/stdlib.h:108:12: note: expected const char *’ but argument is of type char
 extern int atoi (const char *__nptr)

Tentei mexer, colocar aquele const char, mas sempre da um erro diferente, como uso a função atoi corretamente?

Postado

 

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

int main(){
    int mult1=0,mult2=0,n=10;
    /*Obs: Para armazenar 11 caracteres não nulos o vetor da string
    deve conter pelo menos 12 posições, pois a 12ª deverá conter o
    caractere nulo '\0', que indica onde acaba a string.*/
    char cpf[12];

    printf("Digite seu cpf no formato(XXXXXXXXXXX)");
    fgets(cpf,12,stdin);
    for(int i=0;i<1;i++){
        /*É aqui que você precisa converter o caractere do dígito
        numérico para o número inteiro correspondente, para então 
        fazer a multiplicação: */
        mult1 += (cpf[i] - '0') * n;
        n--;
    }
    printf("%d", mult1);

    return(0);
}

A função atoi() recebe como parâmetro uma string inteira, por exemplo converteria "123" para 123 (centro e vinte e três) inteiro, logo mandar um único caractere não é possível, seria necessário passar pelo menos uma string de 2 posições com o caractere seguido pelo caractere nulo. Veja alguns exemplos:

 

char c[4] = "123";
atoi(c); //retorna 123

c[0] = '1';
c[1] = '\0';
atoi(c); //retorna 1

atoi("1"); //retona 1 pois com aspas duplas é uma string
atoi("123"); //retorna 123

/*Mas as duas situações abaixo não funcionam, pois está
sendo passado apenas um único char para a função.*/
atoi('1');
atoi(c[0]);

 

Postado

Entendi, usei uma string de troca e consegui, segue o código :

int main(){
  int vet[11],i;
 char cpf[12],stroca[2];


 printf("Digite seu cpf no formato(XXXXXXXXXXX)");
 fgets(cpf,12,stdin);
 for(i=0;i<11;i++){
   stroca[0]=cpf[i];
   vet[i]=atoi(stroca);

 }

 

Visitante
Este tópico está impedido de receber novas respostas.

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!