Linguagem C - função que recebe um inteiro e retorna uma string. Dá erro

Estou tentando fazer o programa abaixo, mas esta apresentando erro.

//Recebimento de inteiro e retornando string
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char musicas (int estilo)
{
     char genero[4][11]={"pop", "rock", "mpb", "bossa nova"};
     char escolha[15];
     int i=0;
            
     strcpy (escolha, genero[estilo-1]);
     return(escolha);     
     }

int main()
{
    int opcao=0;
    printf ("ESTILOS DE MÚSICA: ");
    printf ("1 - POP ");
    printf ("1 - ROCK ");
    printf ("1 - MPB ");
    printf ("1 - BOSSA NOVA ");
    printf ("Digite o estilo de música que você prefere: ");
    scanf  ("%d", &opcao);
    printf ("Você escolheu: %c", musicas(opcao));
    return(0);
    }

Um método em C não deve retornar um char*, a menos que você saiba o que está fazendo.
Ele normalmente deve copiar em um char*. Por exemplo:

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

int musicas (int estilo, char *escolha) {
    char *genero[] = { "pop", "rock", "mpb", "bossa nova" };
    if (1 <= estilo && estilo <= sizeof (genero) / sizeof (genero[0])) {
        strcpy (escolha, genero [estilo - 1]);
        return 1;
    }    
    return 0;
}
int main (int argc, char *argv[]) {
    int opcao=0;  
    char escolha [32];
    while (opcao != 0) {
        puts ("ESTILOS DE MÚSICA: ");  
        puts ("1 - POP ");  
        puts ("2 - ROCK ");  
        puts ("3 - MPB ");  
        puts ("4 - BOSSA NOVA ");  
        puts ("Digite o estilo de música que você prefere, ou 0 para sair: ");  
        scanf ("%d", &opcao);
 
        if (musicas (opcao, escolha)) {
            printf ("Você escolheu: %s\n", escolha);
        } else if (opcao != 0) {
            puts ("Escolha errada (deve ser um numero de 1 a 4, ou 0 para sair)");
        }
    }
    return (0);
}

valeu pela dica.

Mas você utilizou ponteiro, não tenho como fazer sem usar ponteiro?

Em C++ eu faria assim:

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

 string musicas (int estilo) {
     const char *genero[] = { "pop", "rock", "mpb", "bossa nova" };  
     if (1 <= estilo && estilo <= sizeof (genero) / sizeof (genero[0])) {  
         return genero [estilo - 1];
     }      
     return "";
 }
 int main (int argc, char *argv[]) {  
     int opcao=0;    
     string escolha;
     do {  
         cout << "ESTILOS DE MÚSICA: " << endl; 
         cout << "1 - POP " << endl; 
         cout << "2 - ROCK " << endl; 
         cout << "3 - MPB " << endl; 
         cout << "4 - BOSSA NOVA " << endl;    
         cout << "Digite o estilo de música que você prefere, ou 0 para sair: " << endl; 
         cin >> opcao;
   
         if (!(escolha = musicas (opcao)).empty()) {  
             cout << "Você escolheu: " << escolha << endl;
         } else if (opcao != 0) {  
             cout << "Escolha errada (deve ser um numero de 1 a 4, ou 0 para sair)" << endl;  
         }  
     } while (opcao != 0);
     return 0;  
 }  

Aqui não há nenhum ponteiro.

Estou aprendendo C e o que seria “using namespace std”

Posso retornar string, em um método?

Bom nunca iria funcionar pois você esta pedindo pra retornar um char mas deseja retornar um char* ou seja um cadeia de chars em outras palavras uma string.

Se estiver usando C++ utilize o tipo std::string que é o que você procura, em C não é possivel tratar strings sem utilizar ponteiros. Uma simples alteração resolve seu problema.

//Recebimento de inteiro e retornando string
#include &lt;stdio.h&gt;
#include &lt;string.h&gt;

char* musicas (int estilo)
{
     char genero[4][11]={"pop", "rock", "mpb", "bossa nova"};
     char* escolha = new char[15];
     int i=0;
            
     strcpy (escolha, genero[estilo-1]);
     return(escolha);     
}

int main()
{
    int opcao=0;
    printf ("\nESTILOS DE MÚSICA:\n");
    printf ("1 - POP ");
    printf ("1 - ROCK ");
    printf ("1 - MPB ");
    printf ("1 - BOSSA NOVA ");
    printf ("\nDigite o estilo de música que você prefere: ");
    scanf  ("%d", &opcao);
    printf ("\nVocê escolheu: %s\n", musicas(opcao));
    return(0);
    }

Como esta usando o stdlib (eu tirei pq não é necessario) creio que esta usando C++ certo ? Então use o std::string.

Abraços.

ps: enantiomero eu não entendi a parte do sizeof ali em cima, procure apresentar legibilidade no código e C++ não é C é só uma dica quando usar C++ use apenas funções C++, deixe C de lado.

Ah, sim, desculpe, é que eu deveria ter posto a seguinte definição:

#define dim(array) \
    sizeof (array) / sizeof (array[0])

Por exemplo, dim (um array dimensionado com 10 posições) == 10.

     const char *genero[] = { "pop", "rock", "mpb", "bossa nova" };    
     if (1 <= estilo && estilo <= dim (genero)) {    
         return genero [estilo - 1];  
     }

[quote=rsaforuns]Estou aprendendo C e o que seria “using namespace std”

Posso retornar string, em um método?
[/quote]

using namespace std;

Você precisa usar isto sempre que for usar o tipo string.

Em suma um namespace é para resolver possíveis conflitos de nomenclatura.

Namespace serve para separar suas funções ou de outras libs das demais libs, tipo você pode ter uma função chamada puts(char*) e estar usando o puts(char*) do stdio ai ele não sabe qual função chamar, assim pra não acontecer o mesmo com as funções do std você tme de declarar quais conjuntos de funções ira usar, neste caso o std;

Só use todo um namespace quando for usar diversas vezes funções inerentes aquele namespace. Se não um std::funcao ja funciona e aumenta um pouco a performance.

Abraço.

ps: Espero ter explicado direito, caso não esteja muito claro e você ainda esta começando em programação deixe pra estudar sobre isso um pouco mais frente, quando aprender resolução de escopo essas coisas.

Estou usando C e não C++

Tentei implementar como no exemplo abaixo

[code]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* musicas (int estilo)
{
char genero[4][11]={“POP”, “ROCK”, “MPB”, “BOSSA NOVA”};
char* escolha = new char[15];
int i=0;

  strcpy (escolha, genero[estilo-1]);  
  return(escolha);       
  }

int main()
{
int opcao=0;
printf ("\nESTILOS DE MÚSICA:\n");
printf ("1 - POP ");
printf (“1 - ROCK “);
printf (“1 - MPB “);
printf (“1 - BOSSA NOVA “);
printf (”\nDigite o estilo de música que você prefere: “);
scanf (”%d”, &opcao);
printf (”\nVocê escolheu: %s\n”, musicas(opcao));
printf (”\n”);
system (“pause”);
return(0);
}
[\code]
Estou utilizando C e não C++.
Está apresentando erro na seguinte linha:
char* escolha = new char[15];
Erro: ‘new’ undeclared (first use in this function)

char* escolha = (char *) malloc (15);

Valeu, funcionou.