Ir para conteúdo
Fórum Script Brasil
  • 0

como retornar uma string


glicose

Pergunta

Então, eu queria saber como fazer um return de string. O meu professor disse que era +ou- isso que está no código, mas ele também acabou não lembrando como fazia, e o sinal bateu rs

O programa inverte um texto só pra avisar

Aguardo quem puder me dar uma força...

_____________________________

char inverte(char *nome);


int main()
{
  int i;
    char texto[20];
    
printf("Digite o texto: ");
gets(texto);

inverte(texto);

printf("%s",  inverte(texto)); // ele dá erro justamente aqui

                
getch();
} 


char inverte(char *nome)
{
    int i, j=0; 
    char inv[20];
     
    i=strlen(nome)- 1;

    for (;i>=0;i--,j++)
    {
        inv[j]=nome[i];
                        
    }
    
  return(*inv);   //como faço pra retornar a string inv? e imprimir ela no main, ou mesmo guardar em uma variável do main
    
}

Editado por kuroi
Adicionar tag CODE
Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

duas coisas, primeiro, você tem q declarar a funcao como ponteiro, assim:

char *inverte(char *nome);
e retornar o endereco da variavel e não o valor (já q, como a propria funcao é um pontero, você tem q retornar o local onde ela aponta), assim:
return inv;
e depois, você não consegue dar printf numa funcao ponteiro, já q ele libera o endereco depois q a funcao é executada. você teria q alocar o espaco pra fazer com o print direto. mas ai o esquema é copiar o endereco pra um outro ponteiro. tipo assim:
char *retorno;
strcpy(retorno, inverte(texto));
printf("%s", retorno);[/code] e uma ultima coisa, é bom você finalizar a string de retorno depois de inverter. tipo, depois do for, adicione a linha:
[code]inv[j] = '\ 0';

(so q tire o espaco entre o \ e o 0) porque senao ele não sabe onde termina a string.

Link para o comentário
Compartilhar em outros sites

  • 0
duas coisas, primeiro, você tem q declarar a funcao como ponteiro, assim:

char *inverte(char *nome);
e retornar o endereco da variavel e não o valor (já q, como a propria funcao é um pontero, você tem q retornar o local onde ela aponta), assim:
return inv;
e depois, você não consegue dar printf numa funcao ponteiro, já q ele libera o endereco depois q a funcao é executada. você teria q alocar o espaco pra fazer com o print direto. mas ai o esquema é copiar o endereco pra um outro ponteiro. tipo assim:
char *retorno;
 strcpy(retorno, inverte(texto));
 printf("%s", retorno);
e uma ultima coisa, é bom você finalizar a string de retorno depois de inverter. tipo, depois do for, adicione a linha:
inv[j] = '\ 0';
(so q tire o espaco entre o \ e o 0) porque senao ele não sabe onde termina a string.
Esse exemplo geraria uma falha de segmentação, uma vez que o ponteiro retorno não é inicializado. Sem falar que existe um grande problema no uso do strcpy. Use sempre que possível o strncpy se não quiser ter problemas!! Neste caso, você poderia fazer o seguinte:
char *inverte(char *nome);


int main()
{
  int i;
    char texto[20];
    
printf("Digite o texto: ");
gets(texto); //gets é considerado depreciado, a entrada pode nunca ter um salto de linha e a chamada nunca acabar.
                  //se o usuário entrar 24 ou mais caracteres, a tua entrada vai sobrescrever o valor do inteiro 'i'(buffer overflow)
                  //se ele digitar mais de 28, dependendo do quanto mais for, ele vai sobrescrever as instruções de máquina da
                  //tua função inverte(), fazendo com que o processo tente executar SABE-SE LÁ O QUE na tua máquina!!

inverte(texto);

printf("%s",  inverte(texto)); // ele dá erro justamente aqui

                
getch();
}


char *inverte(char *nome)
{
    int i, j=0;
    char *ret = (char*) malloc((strlen(nome) + 1) * sizeof(char)); //Aloca o espaço necessário
    if (!ret) {
       return ret; //Se malloc retornar nulo é porque não há memória suficiente para alocar o espaço necessário
       }
    
    i=strlen(nome) - 1;

    for (;i>=0;i--,j++)
    {
        inv[j]=nome[i];
                        
    }
    
  return inv; //Do jeito que você escreveu ele iria retornar um caractere. Mais especificamente, o primeiro caractere da string
    
}

Só pra lembrar, aquele SABE-SE LÁ O QUE que escrevi nos comentários do código pode ser, entre uma infinidade de possibilidades, alguma das seguintes:

  • Mandar um e-mail xingando seu chefe
  • Mandar seus códigos fonte para um concorrente
  • Mandar e-mails para todos os teus contatos dizendo que você anda de calcinha em casa

[]'s

Bruno

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...