Ir ao conteúdo
  • Cadastre-se

C++ Código imprimindo strings de forma embaralhada


PauloC19

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
Link para o comentário
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
Link para o comentário
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;
        }
    }

Link para o comentário
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);

 

Link para o comentário
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");
    }
 

Link para o comentário
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
Link para o comentário
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?

Link para o comentário
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
Link para o comentário
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;

 

Link para o comentário
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
Link para o comentário
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
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 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...