Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

thinkabout

[Resolvido] Número de telefone - Ponteiros

Recommended Posts

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);
}

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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);

Edited by Marzkor

Share this post


Link to post
Share on other 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.

Edited by thinkabout

Share this post


Link to post
Share on other 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).

Edited by Marzkor

Share this post


Link to post
Share on other 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);
}

Share this post


Link to post
Share on other 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);

Edited by thinkabout

Share this post


Link to post
Share on other 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);
}

Edited by thinkabout

Share this post


Link to post
Share on other sites
thinkabout

Yep vou fechar a pestana, amanha à mais , ainda ando a nadar um bocado nos ponteiros. Grato pela ajuda.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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%.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.