Ir ao conteúdo
  • Cadastre-se

C++ Problemas com Char / Strings


vashkyo

Posts recomendados

Olá pessoal,

 

Sou leigo em programação e estou com problemas no meu código pra criar uma playlist de músicas (basicamente uma lista encadeada). O código compila e funciona, o problema é quando insiro os dados do tipo char ele não os transfere para a função corretamente, tanto é que quando peço pra imprimir fica tudo errado.

Também não estou conseguindo usar o %s, pois gera um erro.

 

Estou criando a parte de inserir musicas e não estou obtendo sucesso, se alguém puder me ajudar agradeço.

 

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

#define TAMANHO 30

int menu();
void InserirInicio(char v_nome, char v_artista, int m, int s);
void Listar();

struct Musicas {
    char nome[TAMANHO];
    char artista[TAMANHO];
    int min, seg;
    struct Musicas *prox;
} *Head;


int  main() {
    int op, pos, c, m, s;
    char v_nome[TAMANHO];
    char v_artista[TAMANHO];
    Head = NULL;


    while (1) {
        op = menu();
        switch (op) {

        case 1:
            printf("Digite o nome da musica: ");
            gets_s(v_nome);
            while ((c = getchar()) != '\n' && c != EOF) {} //USADO PRA LIMPAR OS DADOS

            printf("Digite o nome do artista: ");
            gets_s(v_artista);
            while ((c = getchar()) != '\n' && c != EOF) {}

            printf("Digite a duracao da musica (mm ss): ");
            scanf_s("%d %d", &m, &s);
            while ((c = getchar()) != '\n' && c != EOF) {}

            InserirInicio(v_nome[TAMANHO], v_artista[TAMANHO], m, s); 
            break;

        case 5:
            Listar();
            break;
        case 6:
            return 0;
        default:
            printf("Invalido\n");
        }
    }
    return 0;
}


    int menu() {
    int op, c;
    system("Cls");

    printf("1.Inserir musica no inicio da lista\n");
    printf("2.Inserir no fim da lista encadeada simples\n");
    printf("3.Inserir no meio da lista encadeada simples\n");
    printf("4.Remover da lista encadeada simples\n");
    printf("5.Listar a lista encadeada simples\n");
    printf("6.Sair\n");
    printf("Digite sua escolha: ");

    scanf_s("%d", &op);
    while ((c = getchar()) != '\n' && c != EOF) {} 

    system("Cls");
    return op;
}


void InserirInicio(char v_nome, char v_artista, int m, int s)
{
    Musicas *NovoElemento;
    NovoElemento = (struct Musicas *)malloc(sizeof(struct Musicas));
    NovoElemento->nome[TAMANHO] = v_nome;
    NovoElemento->artista[TAMANHO] = v_artista;
    NovoElemento->min = m;
    NovoElemento->seg = s;

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


void Listar()
{
    Musicas *ElementoVarredura;
    ElementoVarredura = (struct Musicas *)malloc(sizeof(struct Musicas));

    ElementoVarredura = Head;
    if (ElementoVarredura == NULL) {
        return;
    }
    while (ElementoVarredura != NULL) {
        printf("Nome da música: %c\n", ElementoVarredura->nome); // AQUI TAMBÉM NÃO CONSIGO USAR O %s POIS RETORNA ERRO
        printf("Artista: %c\n", ElementoVarredura->artista);
        printf("Duracao: %d:%d\n\n", ElementoVarredura->min, ElementoVarredura->seg);
        ElementoVarredura = ElementoVarredura->prox;
    }
    printf("\n");

    system("pause");
    return;
}


 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@devair1010Na verdade aprendi algo parecido com meu código em aula, porém lidando com variáveis do tipo int, agora transformando-os em char os resultados ficaram errados. Uso a alocação dinâmica na lista encadeada pra acumula um valor e depois fazer ele apontar pro próximo.  O exercício é o seguinte:

 

Citação

Faça um algoritmo em linguagem C que emule as características de um player de músicas sendo executado em modo texto, via prompt de comando. 


1. Deve-se criar uma playlist das músicas utilizando uma lista encadeada. A lista encadeada poderá ser simples ou dupla, circular ou não circular. Fica a critério do aluno decidir.

 

2. Deve-se armazenar o nome de cada música, do artista/banda e a duração da faixa. Para o armazenamento utilize uma estrutura heterogênea de dados.  

 

3. Para inserção dos dados, você pode criar uma leitura dos dados através de um menu na tela ou já deixá-los armazenados em um arquivo texto no seu computador e só carregar este arquivo ao executar o programa. Ou ambas soluções. Decida também como você irá implementar a inserção (no início, no fim ou no meio da lista encadeada);

 

4. Deve existir um menu na tela. Este menu deve permitir a inserção de novas músicas (caso optado pela inserção manual de dados), deve ter a opção de listar todas as músicas da playlist (listagem de uma lista encadeada) na tela e encerrar o programa; 

 

Postei o exercício mais pra entenderem o porque de algumas coisas. Hoje vou começar a tentar inserir os dados via documento de texto. Em paralelo tento via teclado.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

#include <string.h>
...
// NovoElemento->nome[TAMANHO] = v_nome;
strcpy(NovoElemento->nome, v_nome);
//NovoElemento->artista[TAMANHO] = v_artista;
strcpy(NovoElemento->artista, v_artista);
...
//printf("Nome da música: %c\n", ElementoVarredura->nome);
printf("Nome da música: %s\n", ElementoVarredura->nome);
//printf("Artista: %c\n", ElementoVarredura->artista);
printf("Artista: %s\n", ElementoVarredura->artista);

Achei esses erros no seu código.

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@Flávio Pedroza Obrigado Flávio, implementei as mudanças porém ainda sem sucesso.

 

erro1.jpg.8ce2ccf5906802c894249c8d1b0f8cc0.jpg

adicionado 31 minutos depois

@Flávio Pedroza Flávio, consegui resultados com sua solução!!

 

Além das alterações que você recomendou, alterei as linhas:

//void InserirInicio(char v_nome, char v_artista, int m, int s)
void InserirInicio(char v_nome[TAMANHO], char v_artista[TAMANHO], int m, int s)

Vou prosseguir com o código agora =D

 

Obrigado a todos.

Qualquer dúvida aviso hehe.

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

4 horas atrás, NELSON BRAGA disse:

@vashkyo Prezado @vashkyo,

 

Tenho duas atividades da faculdade e notei que são as mesmas que você já fez.

Gostaria de saber se você tem como compartilhar comigo, visto que não tenho conhecimento suficiente para desenlvolver tudo.

Aguado por seu retorno.

@NELSON BRAGA Olá, fiz sim, lhe entregar pronto não acho certo, até porque não existem 2 códigos 100% iguais desenvolvidos por alunos diferentes. Isso faria com que você e eu tirássemos zero, pois também estou fazendo essa disciplina agora e nem sei se os meus códigos estarão certos.

Mas posso te dar dicas:

1- A primeira questão fiz em cima do que foi aprendido na aula pratica de lista encadeada, inclusive o professor disponibiliza o código que ele fez pra baixar e trabalhar em cima dele.

 

2- A segunda questão é bem relativa, já que pede pra você escolher uma estrutura de dados eficiente para tal situação. Escolhi a Árvore binária, que também tem um exemplo nas aulas práticas.

 

A maior dificuldade que vai ter é que nas aulas foi aprendido a trabalhar apenas com variáveis inteiras, e nesses casos você precisa trabalhar com "char".

Para isso utilize a fica do @Flávio Pedroza, foi indispensável para que conseguisse.

 

Também não tenho muito conhecimento e achei bem confuso de entender os algoritmos, por isso qualquer dúvida poste no fórum, o pessoal aqui foi bem prestativo e rápido em ajudar.

 

Espero ter ajudado com as dicas.

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!