Linguagem C - função que recebe um inteiro e retorna uma string. Dá erro
11 respostas
R
rsaforuns
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>charmusicas(intestilo){chargenero[4][11]={"pop","rock","mpb","bossa nova"};charescolha[15];inti=0;strcpy(escolha,genero[estilo-1]);return(escolha);}intmain(){intopcao=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>intmusicas(intestilo,char*escolha){char*genero[]={"pop","rock","mpb","bossa nova"};if(1<=estilo&&estilo<=sizeof(genero)/sizeof(genero[0])){strcpy(escolha,genero[estilo-1]);return1;}return0;}intmain(intargc,char*argv[]){intopcao=0;charescolha[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);}elseif(opcao!=0){puts("Escolha errada (deve ser um numero de 1 a 4, ou 0 para sair)");}}return(0);}
R
rsaforuns
valeu pela dica.
Mas você utilizou ponteiro, não tenho como fazer sem usar ponteiro?
E
enantiomero
Em C++ eu faria assim:
#include<iostream>#include<string>usingnamespacestd;stringmusicas(intestilo){constchar*genero[]={"pop","rock","mpb","bossa nova"};if(1<=estilo&&estilo<=sizeof(genero)/sizeof(genero[0])){returngenero[estilo-1];}return"";}intmain(intargc,char*argv[]){intopcao=0;stringescolha;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;}elseif(opcao!=0){cout<<"Escolha errada (deve ser um numero de 1 a 4, ou 0 para sair)"<<endl;}}while(opcao!=0);return0;}
Aqui não há nenhum ponteiro.
R
rsaforuns
Estou aprendendo C e o que seria “using namespace std”
Posso retornar string, em um método?
M
MaikoID
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<stdio.h>
#include<string.h>char*musicas(intestilo){chargenero[4][11]={"pop","rock","mpb","bossa nova"};char*escolha=newchar[15];inti=0;strcpy(escolha,genero[estilo-1]);return(escolha);}intmain(){intopcao=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.
E
enantiomero
Ah, sim, desculpe, é que eu deveria ter posto a seguinte definição:
Estou aprendendo C e o que seria “using namespace std”
Posso retornar string, em um método?
usingnamespacestd;
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.
R
rsaforuns
Estou usando C e não C++
R
rsaforuns
Tentei implementar como no exemplo abaixo
[code]
#include
#include
#include
char* musicas (int estilo)
{
char genero[4][11]={"POP", "ROCK", "MPB", "BOSSA NOVA"};
char* escolha = new char[15];
int i=0;
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)