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

dianaalbano

duvida com strcmp

21 mensagens neste tópico

Boas noites

Estou com alguns problemas ao fazer um trabalho em C++.

Neste momento tenho erros de linkagem que não sei como me livro deles.

Depois tenho duvidas em alguns codigos.

void menuClientes()
{
int opcao;

do
{
	cout << "1. Inserir Cliente" << endl;
	cout << "2. Alterar Cliente" << endl;
	cout << "3. Eliminar Cliente" << endl;
	cout << "4. Sair" << endl;
	cin >> opcao;
}
while (opcao<1 || opcao>4);

switch (opcao)
{
case 1: insereCliente();
	break;
case 2: submenu_alteraCliente();
	break;
case 3:submenu_eliminaCliente();
	break;
case 4:
	break;
}
} 


void submenu_alteraCliente()
{
string nome;
int i, flag=0;

do 
{
	cout << "Qual o Cliente que deseja alterar?" << endl;
	cin >> nome;
	for (i=0; i<clientes.size(); i++)
	{
		if (strcmp(clientes[i].cl_nome, nome) == 0)
		{
			alteraCliente();
		}
		else
			break;
	}

}
while (flag=0);
}

void submenu_eliminaCliente()
{
int opcao;

do 
{
	cout << "1. Eliminar por Nome" << endl;
	cout << "2. Eliminar por Numero" << endl;
	cout << "3. Sair" << endl;
	cin >> opcao;

} 
while(opcao<1 || opcao>2);

switch (opcao)
{
case 1: eliminaNome();
	break;
case 2: eliminaNumero();
	break;
case 3:
	break;
}

}

void eliminaNome()
{
string nome;
int i, flag=0;

do 
{
	cout << "Qual o nome do Cliente que deseja apagar?" << endl;
	cin >> nome;
	for (i=0; i<clientes.size(); i++)
	{
		if (strcmp(clientes[i].cl_nome, nome) == 0)
		{
			eliminaCliente();
		}
		else 
			break;
	}

}
while (flag=0);
}

void eliminaNumero()
{
string  numero;
int i, flag=0;

do 
{
	cout << "Qual o numero do Cliente que deseja apagar?" << endl;
	cin >> numero;
	for (i=0; i<clientes.size(); i++)
	{
		if (strcmp(clientes[i].id_cliente, numero) == 0)
			eliminaCliente();
		else 
			break;
	}

}
while (flag=0);
}

Acham que este código está correcto? Eu acho que os strcmp estão mal uma vez que me dão o seguinte erro: error C2664: 'strcmp' : cannot convert parameter 1 from 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' to 'const c.

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Lê as regras deste fórum, podes seguir o link na minha assinatura. Assim de cabeça violaste 3 ao mesmo tempo numa só mensagem.

Não me leves a mal, mas tudo me leva a crer que este código não foi escrito por ti. Estou certo?

É que uma duvida concreta não é propriamente chapar um programa completo e perguntar se o código está correcto.

O compilador deve dizer-te na mensagem de erro qual a linha da chamada do strcmp que está a dar erro.

Tudo indica que estás a tentar passar como parametro na strcmp um objecto que não é uma string.

EDIT: Epa... tipo... clientes.cl_nome não está definido em lado nenhum e estás a manda-lo como parametro para a função strcmp... claro que dá caldo!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Peço desculpa por tudo o que violei, não era a minha intenção. Mais uma vez muitas desculpas.

Em relação ao código fui mesmo eu que o fiz, mas pk perguntou isso?

Também não se encontra aqui o código completo mas sim apenas uma parte. O vector foi definido anteriormente (logo não está naquele pedaço de código).

Será que me podia ajudar?

E mais uma vez desculpa, não fiz isto com más intenções.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

já agora, os erros c o strcmp dá em todas as linhas onde este se encontre.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que o melhor vai ser pores mais um pouco de código. Especialmente o código da classe Cliente e onde crias o vector de clientes.

Assim é um pouco díficil de saber qual é o erro.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu estou a tentar ajudar.

Ok, então vamos lá resolver isto. Vamos lá ver se eu não me troco todo com os scopes.

O problema é o seguinte, o objecto clientes, mesmo estando definido noutro lado não é visivel do interior das tuas funções. Tens que o passar por parametro nas tuas funções do menu principal.

Se a precisares de alterar então tens que passar a referencia para o dito objecto.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

desculpa, é a primeira vez que programo em c++ e não tou e entender aquilo que me estas a querer dizer...

Podes ser mais simples (se isso for possivel)?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Por exemplo... na função submenu_alteraCliente() quando chamas o strcmp() isto:

clientes.cl_nome

não está definido.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eu tenho o vector clientes definido antes do main, tenho que o definir nesta função, é isso?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

id_cliente é um array de caracteres? e numero também? (strcmp não trabalha com strings (c++), trabalha com arrays de caracteres...)

se estás a trabalhar com strings podes comparar usando ==.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É assim. Eu defini uma classe para os clientes onde o id_cliente é o numero de identificação do mesmo e tá definido como int id_cliente.

Vou te mostrar a classe:

class Clientes

{

public:

int id_cliente;

string cl_nome;

string cl_morada;

int data_nasc;

int cl_nif;

int cl_contacto;

//Construtores

Clientes (void);

Clientes (int id_cliente, string cl_nome, string cl_morada, int data_nasc, int cl_nif, int cl_contacto);

//Destructor

~Clientes(void);

void insereCliente();

void alteraCliente();

void eliminaCliente();

Tenho alguma coisa mal? ou entao n consigo entender os conceitos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não podes fazer strcmp(int, string)................................

quanto ao resto nem me pronuncio, mas vai dar ao mesmo...

Tens de comparar strings com strings e ints com ints, por isso alteras alguns tipos no código e alteras também os métodos de comparação. Podes usar ==

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu sei... Só tava a fazer isso num, ja emendei mas continua a dar os mesmo erros

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

já agora, porque dizias que não tinha sido eu a fazer o código?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Emendei as coisas e pus assim

if ((clientes.id_cliente == numero) == 0)

eliminaCliente();

else

break;

em vez de utilizar o strcmp, agora não dá erros, é isto?

Agora tenho erros de linkagem:

Main.obj : error LNK2001: unresolved external symbol "void __cdecl eliminaCliente(void)" (?eliminaCliente@@YAXXZ)

Main.obj : error LNK2001: unresolved external symbol "public: __thiscall Clientes::~Clientes(void)" (??1Clientes@@QAE@XZ)

como me vejo livre disto?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Afinal ja n preciso de ter == 0basta so um = ao outro.

Mas estes erros de linkagem n desaparecem, sabes porquê?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Um dos erros é porque tu chamas eliminaCliente(); directamente quando a função não existe. O que existe é um método em cliente com esse nome e como tal tem que ser chamado a partir do objecto. Nesse caso (sem saber como está feito o método) imagino que será algo como:

clientes[i].eliminaCliente();

Outra coisa que me parece que tens mal é nessa comparação que acabas-te de fazer. Tu para ver o código do cliente não podes ler o id_cliente do vector de clientes, tens que ler o id_cliente de um cliente específico. Mais uma vez seria algo como:

if( clientes[i].id_cliente == numero )

Quanto ao erro de link no destructor não tenho a certeza mas verifica se tens o destructor feito ou se apenas o declaras-te aí.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se tens objectos do tipo string podes usar o método compare em vez de usares o strcmp de C.

#include <iostream>
#include <string>
using namespace std;

int main(void) {

string str1 = "teste";
string str2 = "teste123";

cout << "str1.compare -> " << str1.compare(str2) << endl;

return 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O strcmp já está tratado agora tenho os erros de linkagem.

Como me vejo livre deles?

Obrigado

0

Partilhar esta mensagem


Link 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