Ir para o conteúdo
thinkabout

[Resolvido] Número de telefone - Ponteiros

Mensagens Recomendadas

thinkabout

Boas Pessoal,

Podiam-me dar uma mãozita, ando-me a iniciar nos ponteiros mas ainda ando completamente perdido.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <ctype.h>
#define TAM 3 // Para a verificação ser menor

/*
Desenvolva uma função que verifique se uma sequência de caracteres representa um número
de telefone da rede fixa PT. A sequência deve obedecer à seguinte propriedade:
-  É composta por 9 caracteres, em que o primeiro representa o dígito 2 e os restantes
qualquer um dos 10 dígitos existentes.
A declaração da função é a seguinte: void verifica(char *tel, char *c);
O argumento tel aponta para o primeiro elemento da sequência de caracteres que representa o
número de telefone (existe um ‘\0’ no final) e o argumento c aponta para uma variável do tipo
caracter onde deve ser colocado o resultado da avaliação.
Se o número de telefone analisado for
válido deve aí ser colocado o caracter ‘V’. Caso contrário, deve ser colocado o caracter ‘I’.
Nota: pode utilizar a função int isdigit(char c); da biblioteca <ctype.h>.
Devolve um valor diferente de 0 se o argumento c for um caracter que represente um dígito.
*/
void verifica(char *tel, char *c)
{
int i = 0,digito=0;

for (i = 0; i < TAM; i++)
{
 if (isdigit(tel[i]))
 {
  digito++;
 }
}
if (digito == TAM)
{
 puts("É número de telefone");
}
else
{
 puts("Nao é número de telefone");
}
}
int main()
{
int x;
char tel[TAM], verificacao;
for(x=0;x<TAM;x++)
{
 printf("introduza um numero de telefone\n");
 scanf("%d",&tel[x]);
}
verifica(tel, &verificacao);
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout

Não sei se estou a ir no caminho correcto, e quando corro o código ele da-me sempre que não é numero de telefone, e diz que stack around "tel" está corrupto.

Não sei se estou a mandar os valores correctamente para dentro da função, não sei se a estou a usar bem o isdigit.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Marzkor

for(x=0;x<TAM;x++)
{
 printf("introduza um numero de telefone[b]\n[/b]");
 scanf("%d",&tel[x]);
}

Tas a fazer

%d

num array de char.

Em vez de

for(x=0;x<TAM;x++)
{
 printf("introduza um numero de telefone[b]\n[/b]");
 scanf("%d",&tel[x]);
}

usa

printf("introduza um numero de telefone\n");
scanf("%[^\n]",&tel);

Editado por Marzkor

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout

Está-se a compor, agora só falta certificar que o primeiro digito é 2.

for(x=0;x<TAM;x++)
{
printf("introduza um numero de telefone\n");
scanf("%c", &tel[x]);
fflush(stdin);
}

Já me verifica bem a questão dos dígitos, agora faltam os outros detalhes vou tentar afinar isso.

Não compreendo ainda esse scanf

printf("introduza um numero de telefone\n");
scanf("%[^\n]",&tel);

-----

edit

Humm, não faz muito sentindo receber o digito um a um.

A tua forma é mais lógica recebo a string toda de uma vez mas não entendo esse sinal, vou ver o que significa.

De qualquer forma ele recebe bem a string e corre bem a verificação contudo dá erro stack around variable "tel" got corrupted

-----

edit 2

Se aumentar o tamanho em +1, ganho o espaço para '\n' e deixo de ter problemas, agora é so afinar o resto do código.

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Marzkor

Então já esta tudo resolvido?

O normal é usar

%s

Mas

%[^\n] 

Lê tudo menos o enter (\n). Se não no final da string tinhas \n \0, com (%s).

Editado por Marzkor

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout

Ando a lutar com o char agora.

'char *' differs in levels of indirection from 'int

void verifica(char *tel, char *c)
{
int j = 0,digito=0;
if(tel[0] == '2') // Verifica o primeiro digito, como recebemos em char temos que usar o '2'
{
for (j = 0; j < TAM; j++)
{
if (isdigit(tel[j]))
{
digito++;
}
}
printf("O numero de digitos e %d \n", digito);
if (digito == TAM-1)
{
puts("E nr de telefone");
}
}
else
{
puts("Nao e nr de telefone");
c = 'i';  // <---- problema
}
}
int main()
{
char tel[TAM], verificacao;
printf("introduza um numero de telefone\n");
gets(tel);
verifica(tel, &verificacao);
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout

Não posso usar a atoi, o meu problema não é na verificação do número esse já está tratado.

O meu problema é aqui

c = 'i';  // <---- problema

Isto no main funciona bem , dentro da função não.

No programa main quero ter um

printf(%c", verificacao);

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout

*c='i'

lool

Dammm i am so n00b.

A bombar agora ;)

void verifica(char *tel, char *c)
{
int j = 0,digito=0;
if(tel[0] == '2') // Verifica o primeiro digito, como recebemos em char temos que usar o '2'
{
 for (j = 0; j < TAM; j++)
 {
  if (isdigit(tel[j]))
  {
digito++;
  }
 }
 // printf("O numero de digitos e %d \n", digito);
 if (digito == TAM-1)
 {
  // puts("E nr de telefone");
  *c = 'V';
 }
}
else
{
 // puts("Nao e nr de telefone");
 *c = 'I';
}

}

int main()
{
char tel[TAM], verificacao;
printf("introduza um numero de telefone\n");
gets(tel);
verifica(tel, &verificacao);
printf("O numero de telefone e %c \n" , verificacao);
}

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

xii ... que complicação ...

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

// TAM = 10 (9 para os dígitos e 1 para o '\0'
#define TAM 256

void verifica(char *tel, char *c)
{
 long check = 0;

 // úma única linha ... (se bem com várias verificações)
 *c = strlen(tel) != 9 || sscanf(tel, "%ld", &check) != 1 || check < 200000000 || check > 299999999 ? 'I' : 'V';
}

int main()
{
 char tel[TAM], verificacao;

 // pedir o número
 printf("introduza um numero de telefone : ");
 fflush(stdout);

 // ler o número
 fgets(tel, TAM, stdin); // <------ usar sempre o fgets !!!
 // remove ro caracter de fim de linha lido pelo fgets
 if (tel[strlen(tel) - 1] == '\n')
 {
   tel[strlen(tel) - 1] = '\0';
 }

 // cahamada da funçao de verificação
 verifica(tel, &verificacao);

 // apresentar resultado
 printf("O numero de telefone e %s\n" , verificacao == 'V' ? "valido" : "invalido");
}


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
brunoais

E cuidado com o segmentation fault!


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.