-2

好吧,这是我需要做的一个练习,但我停留在这一点上,我尝试在我的程序中注册一张新专辑,当我选择一位艺术家时它停止工作。

任何人都知道为什么我的程序崩溃了?我在控制台/调试/编译中没有任何错误。

funcoes.c

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #include "funcoes.h"

    void mostraMenu( void )
    {
        printf("\n\nChoose one \n 1 - Register Artist \n 2 - Register Music \n 3 - Register Album \n 4 - List Music \n 5 - List Artist\n 0 - Exit \n");
    }

    void cadastrarArtista( Artista **vetArt , int nArt)
    {

        Artista *tmp;
        tmp = (Artista*)malloc( sizeof( Artista ) );
        setbuf(stdin, NULL);
        printf("Informe o nome do artista:\t");
        scanf("%[^\n]s", tmp->nome);
        setbuf(stdin, NULL);

        printf("Informe a nacionalidade:\t");
        scanf("%[^\n]s", tmp->nacionalidade);
        setbuf(stdin, NULL);

        vetArt[nArt] = tmp;
    }

    void cadastrarMusica( Musica **vetMus , int nMus)
    {

        Musica *tmp;
        tmp = (Musica*)malloc( sizeof( Musica ) );
        setbuf(stdin, NULL);
        printf("Informe o nome da musica:\t");
        scanf("%[^\n]s", tmp->nome);
        setbuf(stdin, NULL);

        printf("Informe o ano:\t");
        scanf("%d", &tmp->ano);
        setbuf(stdin, NULL);

        vetMus[nMus] = tmp;
    }

    void cadastrarAlbum (Album *vetAlbum, Musica **vetMusica, int tamanhoMusicas, Artista **vetArtistas, int tamanhoArtistas)
    {
        Album albumAux;
        vetAlbum->musicas =(Musica**) malloc(sizeof(Musica *));
        vetAlbum->artistas = (Artista**) malloc(sizeof(Artista *));

        int numArtAlb, numMusAlb, i,a = 0;
        char _nome[TAM_NOME] , _musica[TAM_NOME];
        if( tamanhoArtistas == 0 || tamanhoMusicas == 0 )
        {
            printf("There is not at least one artist/music");
            return;
        }

        printf("\tName of the album:\t");
        setbuf(stdin, NULL);
        scanf("%[^\n]s", vetAlbum->nome);
        setbuf(stdin, NULL);
        printf("\tYear of the album:\t");
        scanf("%d", &vetAlbum->ano);
        setbuf(stdin, NULL);

        while(a != 3)
        {
            start:
            printf("\t1 - Associate an Artist with album \n\t2 - Associate music with album\n\t3 - Parar\n");
            scanf("%d", &a);
            switch(a)
            {
                case 1:

                    printf("\tArtist Name:\t");
                    setbuf(stdin, NULL);
                    scanf("%[^\n]s", _nome);
                    setbuf(stdin, NULL);

                    for(i = 0; i < tamanhoArtistas; i++)
                    {
                        if ( strcmp(vetArtistas[i]->nome, _nome) == 0 )
                        {
                            printf("\tArtist Found!\n");
                            vetAlbum->artistas[numArtAlb] = vetArtistas[i];
                            numArtAlb += 1;

                            vetAlbum->num_artistas = numArtAlb;
                            albumAux.artistas = (Artista**)malloc((numArtAlb +1)*sizeof(Artista*));

                            if ( albumAux.artistas != NULL )
                            {
                                vetAlbum->artistas = albumAux.artistas;
                            }
                            break;
                        }
                        else if( strcmp (vetArtistas[i]->nome, _nome) != 0 && i == tamanhoArtistas-1)
                        {
                            printf("\tThis Artist does not exist!\n");
                            goto start;
                        }
                    }
                    break;
                    //FIM FOR

                case 2:
                    printf("\tName of the music:\t");
                    setbuf(stdin, NULL);
                    scanf("%[^\n]s", _musica);
                    setbuf(stdin, NULL);

                    for(i = 0; i < tamanhoMusicas; i++)
                    {
                        if ( strcmp(vetMusica[i]->nome, _nome) == 0 )
                        {
                            printf("\tMusic Found!\n");
                            vetAlbum->musicas[numMusAlb] = vetMusica[i];
                            numMusAlb += 1;

                            vetAlbum->num_musicas = numMusAlb;
                            albumAux.musicas = (Musica**)malloc((numMusAlb +1)*sizeof(Musica*));

                            if ( albumAux.musicas != NULL )
                            {
                                vetAlbum->musicas = albumAux.musicas;
                            }
                            break;
                        }
                        else if( strcmp (vetMusica[i]->nome, _musica) != 0 && i == tamanhoMusicas-1)
                        {
                            printf("\tMusic not found!\n");
                            goto start;
                        }
                    }
                    break;

                case 3:

                    if(numArtAlb == 0 || numMusAlb == 0){
                        printf("\tOne album need at least one music/artist!\n");
                        goto start;
                    }else{
                        break;
                    }

                default:

                    printf("Invalid Option\n");
                    break;
            }
            //FIM SWITCH

        }
        //FIM WHILE
    }
//FIM FUNCAO

函数库

#ifndef funcoes_h
#define funcoes_h

/* Definição do tamanho máximo de um nome */
#define TAM_NOME 80

typedef struct {
    char nome[TAM_NOME];
    int ano;
} Musica;

typedef struct {
    char nome[TAM_NOME];
    char nacionalidade[TAM_NOME];
} Artista;

typedef struct {
    char nome[TAM_NOME];
    int ano;
    Musica **musicas;
    int num_musicas;
    Artista **artistas;
    int num_artistas;
} Album;

void mostraMenu( void );
void cadastrarArtista(Artista **vetArt, int nArt);
void cadastrarMusica(Musica **vetMus, int nMus);
void cadastrarAlbum(Album *vetAlbum, Musica **vetMusica, int tamanhoMusicas, Artista **vetArtistas, int tamanhoArtistas);
#endif

主程序

#include <stdio.h>
#include <stdlib.h>
#include "funcoes.h"
int main ( void )
{
 Artista **vetArt = (Artista**)malloc(sizeof(Artista*));
 Musica **vetMus = (Musica**)malloc(sizeof(Musica*));
 Album *vetAlbum = (Album*)malloc(sizeof(Album));

 int nArt = 0;
 int nMus = 0;
 int nAlb = 0;
 int opcao;
 int op = 0;

while( op == 0)
{
     mostraMenu();
     scanf("%d",&opcao);
     if ( opcao == 0 )
     {
         op = 1;
         break;
     }
     else if (opcao == 1)
     {
        Artista **artAux = (Artista**)malloc((nArt+1)*sizeof( Artista* ) );
        if (artAux == NULL)
        {
            printf( "Alocacao invalida.");
            exit(EXIT_FAILURE);
        }
        free(artAux);
        cadastrarArtista( vetArt , nArt );
        nArt += 1;

     }else if (opcao == 2)
     {
        Musica **musAux = (Musica**)malloc((nMus+1)*sizeof( Musica* ) );
        if (musAux == NULL)
        {
            printf( "Alocacao invalida.");
            exit(EXIT_FAILURE);
        }
        free(musAux);
        cadastrarMusica( vetMus , nMus );
        nMus += 1;

     }else if (opcao == 3)
     {
        cadastrarAlbum(vetAlbum, vetMus, nMus, vetArt, nArt);
        nAlb += 1;
     }
}
 return 0;
}
4

1 回答 1

0

使用 Clang 编译代码会产生几个警告,这些警告与在初始化之前使用numArtAlb和的事实有关。numMusAlb它们可能应该被初始化为零:

int numArtAlb = 0, numMusAlb = 0, i,a = 0;
于 2013-06-23T19:23:37.347 回答