Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

K3L3M0

[Resolvido] Erro com char

Recommended Posts

Estou usando o seguinte código, mas está dando 2 erros que eu sei.

1º - Estou usando variavel do tipo char, mas é muito pequena para caber minha string.

2º - No if da função compara está dando que estou comparando valores de natureza diferente.

 

 

#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <string>

using namespace std ;

bool compara(char); //prototypes

int main( void )
{
 	char ch;
    printf  ("Digite sua senha:\n");
    scanf ("%s", &ch);
    getchar (); 	
    printf("\n");	

	if (compara( ch )){
	   printf("TRUE\n");
    }
    else{
       printf("FALSE\n");     
    }
 	system( "PAUSE" );
 	return (0);	
}


bool compara(char ch)
{
         printf( "%s", &ch );
     if ( ch == "danilo"){
         return (true);
          }
     else{
          return (false);
          }
}

 

Valeu galera!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

O erro está no conceito. O tipo de dados "String" não está definido no C padrão. Strings em C são tratadas como arrays cuja última posição armazena um 0. Pra usar arrays, você precisa de um ponteiro para a sua primeira posição, e a partir daí pode trabalhar com offsets desse endereço pra acessar os outros elementos (neste caso, letras) do array.

 

Então, pra armazenar 10 letras, seria necessário declarar:

 

 char palavra[11];

É declarado "palavra", de 11 bytes. 11, porque, como eu disse acima, é preciso terminar a string com um 0. A partir daí, pode-se armazenar letras de palavra[0] a palavra[9] (10 letras).

 

palavra[0] é o endereço-base do vetor.

 

Outra coisa... como estamos trabalhando com mais de uma posição de memória, não podemos usar operadores de comparação para tratar o vetor todo (como "=="). Poderíamos comparar uma única letra dessa maneira:

 

 if(palavra[0] == 'a') // a palavra começa com a letra 'a'.
 {
     ...;
 }

Para comparar strings inteiras, é preciso usar uma função como a strncmp() (ou a sua prima menos segura, strcmp), strcasecmp(), etc, que retornam 0 se as duas strings são idênticas (strcasecmp() não considera letras maiúsculas e minúsculas), provendo como argumentos as duas strings que se deseja comparar:

 

if (strncmp(palavra, "carro", strlen(palavra)) == 0) // a palavra representada no vetor é "carro".

Aspas duplas significam que se está representando um "vetor de caracteres terminado em 0", e toda vez que se usa aspas simples, representa-se UM caractere. Portanto, "a" é diferente de 'a'. Não se pode passar 'a' para uma função como strncmp(), porque ela espera vetores, e não caracteres, portanto cuidado com isso.

 

O erro do if é esse. Você está tentando comparar um caractere com um vetor de caracteres terminado em 0 (uma "string").

 

 

Outra coisa: pra ler do teclado, use algo como fgets() até que você aprenda a alocar e realocar memória dinamicamente. Scanf() deve ser evitada. Falei alguma coisa sobre isso aqui.

 

E não se preocupe. Isso é bastante informação, mas com algumas semanas de prática você se habitua aos conceitos e tudo fica mais claro. O pessoal costuma mistificar ponteiros, e pintá-los como algo muito complexo, mas é só questão de ler o manual com calma e aplicá-lo. Nada na computação acontece "por acaso".

 

Se você não entendeu alguma coisa, posta que eu explico melhor. Não sei se fui claro o suficiente. Tenta consertar o programa, e posta aqui dizendo se conseguiu ou não. Boa sorte.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, parabens, sua explicação foi simplismente, clara e objetiva, entendi exatamente tudo o que você disse, e já estou aplicando as alterações!

 

Sou programador php, e quero ampliar minha visão em algoritimos, percebi que tenho muito o que aprender, mas com explicações como essa estou no caminho certo do sucesso!!

 

Obrigado mesmo!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.