Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

WESLEY NÓBREGA

Funções com Strings e ponteiros no C

Recommended Posts

Caros,

 

Segue a questão:

 

Implementar uma função que receba um nome de uma pessoa como parâmetro e retorne uma mensagem de boas vindas. Exemplo: Seja bem vindo, João!

 

O que há de errado nessa nesse código simples :

 

#include <stdio.h>
#include <strings.h>
char* printnome(char nome[100]) {
char msg[100]= "Seja benvindo, ";
strcat(msg,nome);
return msg;
}
int main() {
char nome[100], msg[100];
strcpy(nome, "CEAD");
printf("%s",printnome(nome));
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

E ai, seja bem-vindo!
Antes de postar leia as regras do fórum, vc não descreveu o erro que está acontecendo, só apontou o dedo para fazer(como o patrão faz com seus funcionários). Ajude outras pessoas que estão com o mesmo problema a encontrar a resposta eu seu post.

Então vamos lá!

Eis teu código:

 


char* printnome(char nome[100])

 {



  char msg[100]= "Seja benvindo, ";  //problema número 2



  strcat(msg,nome);



  return msg; //atenção!



}


int main()

{



  char nome[100], msg[100]; //problema número 1



  strcpy(nome, "CEAD");



  printf("%s",printnome(nome)); //problema número 3



}

No problema:

1: Você declara a variavel msg (nada de errado se vc for usa-la dentro do main), se vc fizer alguns teste vc verá a função printnome não conhece essa variável.

2: Aqui vc declara msg(essa não tem nada haver com a msg declarada no main). Se vc fosse dar um print nessa variável dentro da função ia funcionar tudo perfeitamente, mas como não é isso o que está fazendo.
Essa variável será alocada na stack, quer dizer que quando perde o escopo da função ela será perdida.

3: printnome retorna msg[] somente para cópia, logo será desalocada.



Olha esse:

char* welcome(const char* name, const char* format = "Welcome %s to my life!")
{
 
  const unsigned int len = (strlen(format) + strlen(name)) -1;
 
  char* buffer = new char[len];
 
  snprintf(buffer,len, format, name);
 
  buffer[len] = '\0';
 
 
  return buffer;
 
 
 
}
int main(int argc, char **argv)
{
 
  char* welcome_name = welcome("Coffe");
 
  printf(welcome_name);
 
}

Na minha implementação usei new para armazenar os dados na memoria heap, assim consigo acessar fora do escopo da função

 

o retorno da função sempre retorna o endereço da memoria onde está alocada a string formatada, então vc pode usar string em outra parte do programa.

WElcome recebe como segundo parametro o formato que a string será concatenada, por padrão welcome tem o formato "Welcome %s! to my life" para reutilização.

Vc pode renomear a função para um nome mais genérico.

Agora vc pode fazer:

const char* goodnight(const char* name)
{
  return welcome(name "Boa Noite %s");
}
const char* goodmorning(const char* name)
{
  return welcome(name "Boa Dia %s");
}

const char* gnight = goodnight("Talisson");
const char* morning = goodmorning("Talisson ");

Legal, não é?

lembre de usar delete

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só um adendo: new é coisa de C++. Se ele estiver programando estritamente em C, não foi um bom exemplo.

(Tem outras coisas que são diferentes entre as duas linguagens, mas não vem ao caso)

O strcpy tem o problema de buffer overflow. O recomendado é usar strncpy.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.