Ir ao conteúdo

Posts recomendados

Postado

Pessoal estou com um problema

tenho o seguinte codigo :

printf("Digite o Telefone:   ");
        scanf("%d",&numeroTel[linha]);

Certo, porém quando eu digito um caractere, ele da erro, já tentei com a biblioteca ctype.h (isdigit)  mas nao funcionou, alguem poderia me ajudar?

 

outra dúvida, como faço para comparar as strings ? dessa maneira esta dando erro e cashando o programa

 case 1:
        printf("\nDigite o nome SEM ERROS a ser pesquisado:  ");
        scanf("%s",&pesquisaNome);
        for (i=0;i<SIZE;i++){
            if (strcmp (nome[i],pesquisaNome) == 0){
                printf("Nome : %s\nNome do Resp.: %s\nNumero do Telefone : %d\nCPF : %d\nRA : %d\n",nome[i],nomeResponsavel[i],numeroTel[i],cpf[i],RA[i]);
                break;
                              }
                          }

 

Postado

Como "numeroTel" está sendo declarada? int? long? unsigned long? long long?

Como você está digitando o número de telefone? Com espaço? Com hífen? Quantos dígitos tem o número de telefone?

Teve outro scanf antes disso? A entrada padrão (stdin) está vazia quando chega nesse scanf?

A variável "linha" está recebendo valores adequados?

Postado
6 horas atrás, RafaelGSS disse:

Pessoal estou com um problema

tenho o seguinte codigo :


printf("Digite o Telefone:   ");
        scanf("%d",&numeroTel[linha]);

Certo, porém quando eu digito um caractere, ele da erro, já tentei com a biblioteca ctype.h (isdigit)  mas nao funcionou, alguem poderia me ajudar?

 

outra dúvida, como faço para comparar as strings ? dessa maneira esta dando erro e cashando o programa


 case 1:
        printf("\nDigite o nome SEM ERROS a ser pesquisado:  ");
        scanf("%s",&pesquisaNome);
        for (i=0;i<SIZE;i++){
            if (strcmp (nome[i],pesquisaNome) == 0){
                printf("Nome : %s\nNome do Resp.: %s\nNumero do Telefone : %d\nCPF : %d\nRA : %d\n",nome[i],nomeResponsavel[i],numeroTel[i],cpf[i],RA[i]);
                break;
                              }
                          }

Na primeira questão vai depender do tipo da variável númeroTel[ ] se é um: int, float, char etc .. Pois au utilizar o %d você esta lendo um inteiro(int) caso tente ler um caracter(char) ele irá retornar '0' mas se você precisa apenas verificar se o que foi informado é caracter ou digito pode utilizar a  a função isdigit do ctype veja um exemplo comentado

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

int main(){
	int numeroTel[10];
	int linha = 1;
	printf("Digite o Telefone:   ");
    scanf("%d", &numeroTel[linha]); //le o valor como inteiro
    printf("%d\n", numeroTel[linha]); // Printa o valor inteiro caso seja informado um caracter irá retornar 0
    printf("%c\n", numeroTel[linha]); // printa em branco pois o tipo da variavel é um int

	//Verifica se o valor informado é um digita ou não caso não printa a mensagem
	if(!isdigit(numeroTel[linha])){
		printf("O numero informado nao HE valido");
	}else{
		printf("O numero informado HE valido");
	}
	
	
	
	return 0;
}

Para a comparação de strings você esta no caminho certo apenas se esqueceu de informar o terceiro parametro da função strcmp(String1, String2, Tamanho) feito isso irá funcionar sem problemas veja um exemplo

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

int main(){
	//Strings a serem comparadas
	char pesquisa[50] = "Joao Silva";
	char nome[50] = "Joao Silva";
		
	//verificação para comparar se sao iguais ou não
	if(strcmp(pesquisa, nome, 50) == 0){ //O ultimo parametro passado 50 e o tamanho da sua string
		printf("As Strings sao iguais");
	}else{
		printf("As Strings nao sao iguais")
	}
	
	
	
	return 0;
}
Spoiler

 

 

Postado

strcmp() só vão 2 parâmetros mesmo, não tem o terceiro parâmetro indicando o número de caracteres.

 

A função em que você define o número de caracteres como você mencionou é strncmp().

Postado

numeroTel é INT , eu só digitei a letra pra ver o erro que acontece, pra eu corrigir, tentei com o isdigit dessa forma :

scanf("%d",numeroTel[linha]);
if(isdigit(numeroTel[linha])==0){

printf("O numero informado nao é valido");

scanf("%d", numeroTel[linha]);

}

 

gostaria que me explicassem porque não deu certo, acho que o problema dá antes de entrar no if né ?

Postado

Numa variável do tipo int só é garantido que seja possível armazenar dados de pelo menos 16 bits, apesar de que dependendo da implementação int pode ser mais longo, mas você não tem garantia disso, o que significa que você só tem certeza de que números entre −32767 e +32767 podem ser armazenados numa variável do tipo int.

 

Se nós passarmos para o tipo unsigned int o intervalo se torna de 0 até +65535.

 

E observe que estes números possuem no máximo 5 dígitos, entretanto números de telefone tem 8 ou 9 dígitos no Brasil, e isso sem contar DDD, e se passamos para números internacionais quantos dígitos o número de telefone pode passar a ter?

 

Portanto, o tipo int não é adequado para armazenar números de telefone.

 

O tipo long int ou long pode deve armazenar números de pelo menos 32 bits, logo o intervalo se torna de −2.147.483.647 até +2.147.483.647, logo é adequado para armazenar um número de 9 dígitos, mas não tem espaço suficiente para incluir o DDD, logo você poderia usar desde que armazenasse o DDD numa variável diferente. (O intervalo para unsigned long int vai de 0 até 4.294.967.295)

 

Para armazenar tanto o DDD como o número de telefone numa única variável, seria necessário usar long long int ou long long pois seu intervalo é de −9,223,372,036,854,775,807 até +9,223,372,036,854,775,807, pois é exigido que armazene pelo menos 64 bits, que é bem maior que o necessário, visto que com 19 dígitos pode armazenar mais que o dobro do que o comprimento do número de telefone. e talvez seja um exagero, por outro lado permitiria armazenar números internacionais que talvez sejam ainda maiores que os números de telefone brasileiros. (O intervalo para unsigned long long seria de 0 até 18.446.744.073.709.551.615)

 

 

Obs: Note que para ler e imprimir números inteiros longos deve-se adicionar l ao especificador de conversão usado nas funções scanf e printf, Exs:

- "%ld" para long

- "%lld" para long long

- "%lu" para unsigned long

- "%llu" para unsigned long long

 

 

Postado

Certo, é de grande ajuda sua explicação, eu não tinha nem reparado que poderia dar erros futuros com esse armazenamento em variável errada. Enfim, sobre o IF, você conseguiria me dizer porque ele não funciona ?

Postado
1 hora atrás, RafaelGSS disse:

Certo, é de grande ajuda sua explicação, eu não tinha nem reparado que poderia dar erros futuros com esse armazenamento em variável errada. Enfim, sobre o IF, você conseguiria me dizer porque ele não funciona ?


Possivelmente o erro do seu IF é querer comparar um char com um vetor de char. tente assim.

if (strcmp (nome,pesquisaNome) == 0)


Caso não seja isso, poste o estado atual do seu código e tente explicar melhor o que acontece de errado no seu IF.

Postado

Estou assumindo que pesquisaNome e nome foram declarados como um vetor e uma matriz de chars de 2 dimensões, respectivamente? Deste tipo:

 

char pesquisaNome[100], nome[10][100];

 

Então nesse scanf:

scanf("%s", &pesquisaNome);

 

Não deve ser usado o & antes do nome do vetor pesquisaNome, pois isto é usado para passar a referência/posição da memória onde são armazenados os dados guardados na variável para a função scanf (e na função esta referência será armazenada num ponteiro), mas quando você passa o nome de um vetor já está passando sua referência não os dados armazenados nele (afinal, para acessar os dados de um vetor diretamente você deve indicar qual dos dados usando os colchetes, por exemplo pesquisaNome[0] para obter a primeira letra).

 

Logo, nesse caso a função scanf deve ser usada assim:

 

scanf("%s", pesquisaNome);

 

 

E no for onde está esse if você está iterando a matriz nome de 0 até SIZE, mas este SIZE é o número total de linhas na matriz ou o número de nomes armazenados na matriz? Pois o problema pode ser que você está comparando a matriz inteira, mas a matriz não foi completamente preenchida, então possivelmente você estaria comparando valores que não são strings (lixo que ficou na memória) com pesquisaNome. Certifique-se de comparar apenas as posições onde já foi armazenado algum nome.

 

Fora isso, não consegui identificar nenhum problema com o seu if, deveria funcionar normalmente.

  • Curtir 1
Postado
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <ctype.h>


#define SIZE 200

char nome[SIZE][50];
char nomeResponsavel[SIZE][50];
int numeroTel[SIZE];
int cpf[SIZE];
int RA[SIZE];
int op;
void cadastro();
void pesquisar();

int main()
{
    cadastro();
    pesquisar();
}

void cadastro()
{
    static int linha;
    do{
        printf("\t\t\t\t\tCADASTRO DE NUMERO %d\n",linha);
        printf("Digite o nome do aluno : ");
        scanf("%s",&nome[linha]);
        system("cls");
        printf("Digite o nome do Respons%cvel : ",160);
        scanf("%s",&nomeResponsavel[linha]);
        system("cls");
        printf("Digite o Telefone:   ");
        scanf("%d",&numeroTel[linha]);
        system("cls");
        printf("Digite o CPF do respons%cvel:   ",160);
        scanf("%d",&cpf[linha]);
        printf("\nDigite seu RA:   ");
        scanf("%d",&RA[linha]);
        system("cls");
        printf("PRONTO! Para cadastrar um novo aluno digite 1, caso n%co, digite qualquer outro n%cmero. ",134,163);
        scanf("%d",&op);
        system("cls");
        linha++;
        }while (op==1);

}
void pesquisar(){
    int i;
    char pesquisaNome;
    int pesquisaRA;
    int pesquisaCPF;
    printf("\t\tPROCESSO DE PESQUISA POR ALUNO. SELECIONE A OP%c%cO : \n ",128,134);
    puts("\n1 ) Pesquisa por nome do aluno\n2 ) Pesquisa por RA\n3 ) Pesquisa por CPF");
    scanf("%d",&op);
    switch(op){
    case 1:
        printf("\nDigite o nome SEM ERROS a ser pesquisado:  ");
        scanf("%s",&pesquisaNome);
        for (i=0;i<SIZE;i++){
            if (strcmp (nome[i],pesquisaNome) == 0){
                printf("Nome : %s\nNome do Resp.: %s\nNumero do Telefone : %d\nCPF : %d\nRA : %d\n",nome[i],nomeResponsavel[i],numeroTel[i],cpf[i],RA[i]);
                break;
            }
        }


    case 2:
        printf("Digite o RA :  ");
        scanf("%d",&pesquisaRA);
        for (i=0;i<SIZE;i++)
            if(pesquisaRA == RA[i])
                printf("Nome : %s\nNome do Resp.: %s\nNumero do Telefone : %d\nCPF : %d\nRA : %d\n",nome[i],nomeResponsavel[i],numeroTel[i],cpf[i],RA[i]);
            break;

    case 3:
        printf("Digite o CPF :");
        scanf("%d",&pesquisaCPF);
        for (i=0;i<SIZE;i++)
            if(cpf[i]==pesquisaCPF)
                printf("Nome : %s\nNome do Resp.: %s\nNumero do Telefone : %d\nCPF : %d\nRA : %d",nome[i],nomeResponsavel[i],numeroTel[i],cpf[i],RA[i]);
            break;

    default:
        puts("Opcao invalida !");
        return pesquisar();
        break;
    }



}

O Código completo. Porém totalmente incompleto, comecei e não dei continuidade ainda...
 

 

Ciroboy, então é errado fazer comparação de um vetor de caracter com um char ? Eu não sabia, vai mais uma pra cachola kk.
 

 

Isnick, Entendi o lance do &, mas char pesquisaNome; não é um vetor, é uma var local que é usada somente para salvar o nome para compara-lo com o nome salvo na função cadastro. Sobre ele ser um ponteiro ele teria que ser declarado com o '*' certo ? Pois se fosse uma função que retornaria um valor ai eu deveria ter declarado ele como um ponteiro e a função com paramentros e que retornasse um valor, e não void, certo ? Ou estou enganado ? Pois, querendo ou não sou bem principiante em C, estou estudando bastante.

 

vango, essa sua dica de " int res = scanf ( "%d", &n );" é muito útil! Eu nunca pensei em fazer isso, a função scanf vai retornar o valor lógico, 0 e 1, certo ? Independente do resultado, o numero ou caracter digitado vai ser salvo na var N ?

 

 Bom pessoal, muito obrigado pela disposição em ajudar! ajudaram bastante, sobre a dúvida do IF o vango me ajudou, só me resta a dúvida que o isnick falou sobre colocar o '&', mas isso vou dar uma revisada em matrizes aqui e já resolvo, obrigado!

Postado

@RafaelGSS  Nesse trecho do seu código:

char pesquisaNome;
.
.
.
scanf("%s",&pesquisaNome);

Percebi que você está tentando armazenar um nome na variável que é um "char". Você tem que assimilar essas coisas abaixo:

 

char = 1 caractere

vetor de char = string

string = palavra / frase

 

Logo, quando você quiser armazenar mais do que uma letra, você tem que usar um vetor do tipo char
 

char pesquisaNome[100];

Com essa variável, você poderá armazenar 100 letras/números. Para preencher a string(vetor de char) utilizando a SCANF, você não coloca o & antes da variável. e nem especifica a posição do vetor.

scanf("%s",pesquisaNome);

Veja se com essas correções você consegue dar continuidade ao seu exercício:
 

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


#define SIZE 200

char nome[SIZE][50];
char nomeResponsavel[SIZE][50];
int numeroTel[SIZE];
int cpf[SIZE];
int RA[SIZE];
int op;
void cadastro();
void pesquisar();

int main()
{
    cadastro();
    pesquisar();
}

void cadastro()
{
    static int linha;
    do{
        printf("\t\t\t\t\tCADASTRO DE NUMERO %d\n",linha);
        printf("Digite o nome do aluno : ");
        scanf("%s",&nome[linha]);
        system("cls");
        printf("Digite o nome do Respons%cvel : ",160);
        scanf("%s",&nomeResponsavel[linha]);
        system("cls");
        printf("Digite o Telefone:   ");
        scanf("%d",&numeroTel[linha]);
        system("cls");
        printf("Digite o CPF do respons%cvel:   ",160);
        scanf("%d",&cpf[linha]);
        printf("\nDigite seu RA:   ");
        scanf("%d",&RA[linha]);
        system("cls");
        printf("PRONTO! Para cadastrar um novo aluno digite 1, caso n%co, digite qualquer outro n%cmero. ",134,163);
        scanf("%d",&op);
        system("cls");
        linha++;
        }while (op==1);

}
void pesquisar(){
    int i;
    char pesquisaNome[100];
    int pesquisaRA;
    int pesquisaCPF;
    printf("\t\tPROCESSO DE PESQUISA POR ALUNO. SELECIONE A OP%c%cO : \n ",128,134);
    puts("\n1 ) Pesquisa por nome do aluno\n2 ) Pesquisa por RA\n3 ) Pesquisa por CPF");
    scanf("%d",&op);
    switch(op){
    case 1:
        printf("\nDigite o nome SEM ERROS a ser pesquisado:  ");
        scanf("%s",pesquisaNome);
        for (i=0;i<SIZE;i++){
            if (strcmp (nome[i],pesquisaNome) == 0){
                printf("Nome : %s\nNome do Resp.: %s\nNumero do Telefone : %d\nCPF : %d\nRA : %d\n",nome[i],nomeResponsavel[i],numeroTel[i],cpf[i],RA[i]);
                break;
            }
        }


    case 2:
        printf("Digite o RA :  ");
        scanf("%d",&pesquisaRA);
        for (i=0;i<SIZE;i++)
            if(pesquisaRA == RA[i])
                printf("Nome : %s\nNome do Resp.: %s\nNumero do Telefone : %d\nCPF : %d\nRA : %d\n",nome[i],nomeResponsavel[i],numeroTel[i],cpf[i],RA[i]);
            break;

    case 3:
        printf("Digite o CPF :");
        scanf("%d",&pesquisaCPF);
        for (i=0;i<SIZE;i++)
            if(cpf[i]==pesquisaCPF)
                printf("Nome : %s\nNome do Resp.: %s\nNumero do Telefone : %d\nCPF : %d\nRA : %d",nome[i],nomeResponsavel[i],numeroTel[i],cpf[i],RA[i]);
            break;

    default:
        puts("Opcao invalida !");
        return pesquisar();
        break;
    }



}

 

Postado

Certo,  nesse trecho do meu código

printf("Digite o nome do aluno : ");
        scanf("%s",&nome[linha]);

a variavel nome recebe o & para indicar a posição na memoria em que vai guardar a string, e linha é a dimensão no caso, certo?

 

Pois bem, e porque na função pesquisa, a variavel char pesquisaNome[100] , Não é necessário do & para indicar o lugar na memória, sei que pesquisaNome é igual a pesquisaNome[0] , a diferença entre passar &nome[linha] e passar &pesquisaNome , é que em nome precisa ser passado o endereço da memoria em onde salvar, pois nome é uma matriz ? e pesquisaNome é um vetor de caracteres ? Só fiquei com dúvida nisso. Mas muito obrigado a todos que tiraram parte do seu tempo para me ajudar.

 

Postado

A questão é que nessa linha também não deveria ter o &.

 

 

Ok, vamos de volta ao básico, quando você declara uma variável você está alocando espaço na memória para a informação que será guardada nela, logo a variável contém a informação que indica a posição na memória onde estes dados serão gravados, assim sempre que chamarmos ou atribuirmos um valor a esta variável o mesmo local da memória será acessado.

 

Esta posição da memória, ou referência, da variável pode ser obtida usando o símbolo & antes do nome da variável.

 

Assim quando fazemos algo como:

int numero;
scanf("%d", &numero);

Estamos não estamos passando para a função scanf o valor armazenado na variável "numero", mas sim a referência desta variável, ou seja passamos para a função a posição na memória onde as informações da variável "numero" é armazenada, assim a função scanf pode acessar e atribuir valores a esta posição da memória, em efeito fazendo alterações diretamente na variável "numero", e depois podemos acessar essa informação guardada usando a própria variável sem o &.

 

(Dentro da função scanf esta referência que foi passada é armazenada num ponteiro, que é o tipo adequado de variável para armazenar referência/posição de memória.)

 

 

Entretanto, quando passamos a lidar com vetores e matrizes, para acessar os dados da variável precisamos indicar qual posição do vetor/matriz usando colchetes, e o nome do vetor/matriz sem os colchetes já indica a referência dele, logo & não deve ser usado.

 

Para explicar melhor vou dar alguns exemplos:

char vetor[50];
vetor;  //referência para o vetor, nesse caso uma string inteira
&vetor[0];  //referência para a primeira posição do vetor, ou seja para o primeiro caractere
vetor[0];  //acessa o dado da primeira posição do vetor, ou seja o primeiro caractere

char matriz[10][50];
matriz; //referência para a matriz inteira
matriz[0]; //referência para a primeira linha da matriz, que sozinha é um vetor, ou seja uma string da matriz
&matriz[0][0]; //referência para a primeira posição da primeira linha da matriz, no caso para o primeiro caractere
matriz[0][0]; //acessa a primeira posição da primeira linha da matriz, no caso acessa o primeiro caractere

 

  • Curtir 1
Postado

Certo, @isrnick, Entendi que :

Uma variável seja Inteira, Char , float etc... para armazenarmos um valor na mesma, deveremos setar o & para passar a função scanf o endereço da memória que será passada a um ponteiro local da função scanf. E como é um ponteiro apontando para nossa variável, o mesmo tem "poder" de altera-la, fazendo assim o armazenamento do valor digitado a variável em questão.
No caso de vetores e matrizes, para declararmos um vetor de caracteres(1byte) por exemplo, colocamos (ou não) o tamanho da extensão do vetor. Vetor ou vetor[0] é referente ao primeiro e o começo do vetor. E assim sucessivamente, sendo que vetor[1] é != de vetor[2] pois cada um pertence a um endereço, por mais que os mesmo estejam consecutivos. Na função scanf matrizes e vetores com o acréssimo do '['(Colchetes) já está sendo passado o endereço da variável para qual ele será armazenado, por isso não é necessário o '&' . Gostaria de saber se minha análise foi  correta.

Alias, muito obrigado a você também @isrnick !

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