Ir ao conteúdo
  • Cadastre-se
PauloC19

C++ Código imprimindo strings de forma embaralhada

Posts recomendados

O nomes digitados no pelo usuário estão sendo listados na tela de maneira incorreta, depois de escolher a opção para listar...como devo proceder?

 

Código:

void Playlist()
{

	Playlist_Musica *ElementoVarredura;
	ElementoVarredura = (struct Playlist_Musica *)malloc(sizeof(struct Playlist_Musica));

    ElementoVarredura = Head;
	if (ElementoVarredura == NULL) {
		return;
	}
	while (ElementoVarredura != NULL) {
		printf("Musica: %s\n", ElementoVarredura->nm);
		printf("Artista/Banda: %s\n", ElementoVarredura->ab);
		printf("Duracao: %.2f", ElementoVarredura->duracao);

		ElementoVarredura = ElementoVarredura->prox;
		printf("\n");
	}

Ao listar os nomes digitados:

 

530234887_ErroImprimirnomes.PNG.4b2244390131494a68b8459fa20fb746.PNG

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que você está tentando fazer nessa linha?

ElementoVarredura = Head;

 

Você acabou de fazer o ponteiro ElementoVarredura apontar para um endereço de um espaço da memória reservado com malloc na linha anterior, mas imediatamente em seguida faz ele apontar para outra coisa?

 

Não entendi...

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@isrnick Boa noite! É para implementar o código com a base da lista encadeada...retirei esse parte, mas acontece erro nessa parte: printf("Musica: %s\n", ElementoVarredura->nm);

Compartilhar este post


Link para o post
Compartilhar em outros sites

A struct Playlist_Musica está definida como?

 

Não tem nada que pareça estar errado nesse printf, O mais provável é que ElementoVarredura esteja apontando para algo errado ou então esses dados não estejam sendo guardados corretamente na lista.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@isrnickEssa parte está imprimindo corretamente: printf("Duracao: %.2f", ElementoVarredura->duracao); agora os outros do tipo string...será alguma parte do elemento de varredura?

 

 A Struct :

 

struct Playlist_Musica {
    char nm[20];
    char ab[20];
    float duracao;
    Playlist_Musica *prox;
} *Head;
 

Função para inserir:

void AdicionarMusica(char nm[20], char ab[20], float duracao)
    {
        Playlist_Musica *NovoElemento;
        NovoElemento = (struct Playlist_Musica *)malloc(sizeof(struct Playlist_Musica));
        NovoElemento->nm[20] = nm[20];
        NovoElemento->nm[20] = ab[20];
        NovoElemento->duracao = duracao;

        if (Head == NULL)
        {
            Head = NovoElemento;
            Head->prox = NULL;
        }
        else
        {
            NovoElemento->prox = Head;
            Head = NovoElemento;
        }
    }

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 horas atrás, PauloC19 disse:

        NovoElemento->nm[20] = nm[20];
        NovoElemento->nm[20] = ab[20];

 

Aí está o problema, essas atribuições não fazem o que você deseja (na verdade nem existe índice 20 nesses vetores, os índices nesse caso vão de 0 a 19, e na segunda linha também está errado, deveria guardar em NovoElemento->ab).

 

Em C não dá para copiar um vetor inteiro fazendo uma atribuição com =, é necessário copiar o valor de cada posição do vetor, um por um.

 

Mas no caso de vetores de caracteres contendo strings já existe a funções para copiar, no caso strcmp() e strncmp() que faz parte da biblioteca string.h então para usar deve incluir essa biblioteca.

 

Nesse caso ficaria assim:

 

#include <string.h>
  
.
.
.

//Copia a string do vetor nm para o vetor NovoElemento->nm:
strcmp(NovoElemento->nm, nm); 
//Copia a string do vetor ab para o vetor NovoElemento->ab:
strcmp(NovoElemento->ab, ab);

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@isrnick A biblioteca string.h estava adicionada, fiz a seguintes alterações, mas continua a imprimir de forma embaralhada.

 

void AdicionarMusica(char nm[20], char ab[20], float duracao)
{
    Playlist_Musica *NovoElemento;
    NovoElemento = (struct Playlist_Musica *)malloc(sizeof(struct Playlist_Musica));
    strcmp(NovoElemento->nm, nm);
    strcmp(NovoElemento->ab, ab);
    NovoElemento->duracao = duracao;

    if (Head == NULL)
    {
        Head = NovoElemento;
        Head->prox = NULL;
    }
    else
    {
        NovoElemento->prox = Head;
        Head = NovoElemento;
    }
}

void Playlist()
{

    Playlist_Musica *ElementoVarredura;
    ElementoVarredura = (struct Playlist_Musica *)malloc(sizeof(struct Playlist_Musica));

 

    ElementoVarredura = Head;  //Retirei essa instrução porém não fez diferença.
    
    if (ElementoVarredura == NULL) {
        return;
    }
    while (ElementoVarredura != NULL) {
        printf("Musica: %s", ElementoVarredura->nm);
        printf("Artista/Banda: %s", ElementoVarredura->ab); 
        printf("Duracao %f", ElementoVarredura->duracao); //Essa parte como eu disse, imprime normal, as intruções acima estão da mesma forma, porém da esse problema, será algo com os caracteres, string?

        ElementoVarredura = ElementoVarredura->prox;
        printf("\n");
    }
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpa indiquei a função errada... strcmp é para comparar strings... 🤦‍♂️

 

strcpy e strncpy são as funções para copiar strings. Então na verdade seria assim:

 

//Copia a string do vetor nm para o vetor NovoElemento->nm:
strcpy(NovoElemento->nm, nm); 
//Copia a string do vetor ab para o vetor NovoElemento->ab:
strcpy(NovoElemento->ab, ab);

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@isrnick Boa noite! Muito Obrigado! Com essa função imprimiu na tela o nomes de forma correta...Estou alterando a base de outro código de uma estrutura de dados, fiz algumas alterações, consegui executar o código, realizar a função de busca por um determinado número que quando digitado pelo usuário, caso estiver cadastrado retorna outras informações na tela, como, nome e email referente aquele número, porém, tem a função de listar na tela os dados que foram cadastrados, mas no momento só consigo imprimir os números, o nome, e o email do cadastro não...pretendo tentar listar os cadastros da esquerda para a direita, em ordem crescente pelos números cadastrados.

 

Função para inserir os dados (cadastrar):

void Inserir(BuscaDados ** ElementoVarredura, int num, char nome, char email)
{

	if (*ElementoVarredura == NULL)
	{
		BuscaDados *NovoElemento = NULL;
		NovoElemento = (BuscaDados *)malloc(sizeof(BuscaDados));
		NovoElemento->esquerda = NULL;
		NovoElemento->direita = NULL;

		NovoElemento->num = num;
		strcpy(NovoElemento->nome, nome);
		strcpy(NovoElemento->email, email);
		*ElementoVarredura = NovoElemento;
		return;
	}

	if (num < (*ElementoVarredura)->num)
	{
		Inserir(&(*ElementoVarredura)->esquerda, num, nome, email);
	}
	else
	{
		if (num > (*ElementoVarredura)->num)
		{
			Inserir(&(*ElementoVarredura)->direita, num, nome, email);
		}
	}
}

Nessa função acima, essa parte está apresentando erros: 

strcpy(NovoElemento->nome, nome);

strcpy(NovoElemento->email, email);

 

 

Função para listar os dados:

void ListarOrdem(BuscaDados *ElementoVarredura, int num)
{
	if (ElementoVarredura)
	{
		ListarOrdem(ElementoVarredura->esquerda);
		printf("%d\t", ElementoVarredura->num);
		ListarOrdem(ElementoVarredura->direita);
	}
}

No caso com essa base só lista na tela os números que foram cadastrados, seus respectivos nomes e emails, não.

Será triplicar essas instruções dentro do if?
 

Pode me orientar?

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, PauloC19 disse:

void Inserir(BuscaDados ** ElementoVarredura, int num, char nome, char email)

{

 

Nos parâmetros da função nome e email são ambos um único caractere cada, para armazenar string é necessário usar um vetor de caracteres. Então nesse caso esses parâmetros nome e email deveriam ser vetores de caracteres ou então ponteiros.

 

void Inserir(BuscaDados ** ElementoVarredura, int num, char nome[], char email[])

//ou

void Inserir(BuscaDados ** ElementoVarredura, int num, char *nome, char *email)

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

 

@isrnick Boa noite, Deu certo certo com essas alterações, com isso, modifiquei a função de listar, acrescentei mais dois printf entre outros, com o nome e email...falta só um detalhe, ao utilizar a função código percebi o seguinte problema: A função buscar ela está pegando sempre as últimas informações digitadas, e utilizando em todas as numerações buscada no código. Por ex.: Digita a numeração: 1111, nome: aaaa, email: aaaaa, depois cadastra outros dados, numeração: 2222, nome, bbbb, email: bbbbb, quando faz a busca pela numeração: 1111, retorna o nome: bbbb e email: bbbbb, invés de mostrar nome: aaaa, email: aaaaa.

 

Função Buscar:

BuscaDados* Buscar(BuscaDados ** ElementoVarredura, int num)
{
	if (*ElementoVarredura == NULL)
		return NULL;

	if (num < (*ElementoVarredura)->num)
	{
		Buscar(&((*ElementoVarredura)->esquerda), num); //Tentei adicionar depois do num: num, nome, email, e assim nas demais, porém, não altera nada.
		
	}
	else
	{
		if (num > (*ElementoVarredura)->num)
		{
			Buscar(&((*ElementoVarredura)->direita), num); 
		}
		else
		{
			if (num == (*ElementoVarredura)->num) 
				return *ElementoVarredura;
		}
	}
}

 

Chamada da função buscar:

case 2:
			printf("Digite o numero a ser buscado: ");
			scanf_s("%d", &num);
			printf("\n");
			system("cls");
			while ((c = getchar()) != '\n' && c != EOF) {}
			ElementoBusca = Buscar(&root, num); //Tentei depois de num, chamar as variáveis: nome[], email[], e não altera nada também
			if (ElementoBusca != 0) {
				printf("Cadastro localizado.\n\n");
				printf("Numero: %d\n", num); 
				printf("Nome: %s\n", nome);
				printf("Email: %s\n\n", email);
			}
			else {
				printf("Cadastro nao localizado.\n");
			}
			system("pause");
			break;

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
14 horas atrás, PauloC19 disse:

			if (ElementoBusca != 0) {
				printf("Cadastro localizado.\n\n");
				printf("Numero: %d\n", num); 
				printf("Nome: %s\n", nome);
				printf("Email: %s\n\n", email);
			}

 

 

Nessa parte do código estão sendo impressas as variáveis erradas (num, nome e email), deveria imprimir os dados contidos no ElementoBusca (ElementoBusca->num, ElementoBusca->nome e ElementoBusca->email).

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@isrnick Boa noite! Muito Obrigado! Com essas modificações o erro foi solucionado e o código rodou perfeitamente. No momento, estou aprendendo sobre estrutura de dados heterogêneas, alocação dinâmica etc.🙏🙌🙏. Até então, não conhecia as funções: "strcpy e strncpy", "strcmp e strncmp". Cada detalhe que você apresentou me ajudou bastante. Obrigado! 

 

  

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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...

GRÁTIS: minicurso “Como ganhar dinheiro montando computadores”

Gabriel TorresGabriel Torres, fundador e editor executivo do Clube do Hardware, acaba de lançar um minicurso totalmente gratuito: "Como ganhar dinheiro montando computadores".

Você aprenderá sobre o quanto pode ganhar, como cobrar, como lidar com a concorrência, como se tornar um profissional altamente qualificado e muito mais!

Inscreva-se agora!