Jump to content

Guardar endereço de apontador


fcl-93
 Share

Go to solution Solved by HappyHippyHippo,

Recommended Posts

#include <iostream>
using namespace std;

/*Retorna o endereço a ultima ocorrência de ch em s caso contrário retorna null*/

char *strrchr(char *s, char ch)
{

char *save = new char[];
save = NULL;

for (; *s != '\0'; s++)
{
if (*s == ch)
{
save = s; // Guarda o endereço de s em save
}
}

// Se save continua a apontar para NULL então retorna Null caso contrário retorna save
if (*save == NULL)
{
return NULL;
}
else
{
return save;
}
}

int main()
{
char s[100];
char ch;
cout << "Insira uma String: " ;
gets_s(s);
cout << "Insira um carater que deseja encontrar na string" << endl;
cin >> ch;
cout << endl;

cout << strrchr(s, ch) << endl;
cin.sync();
cin.get();
return 0;
}
Bom dia tenho uma dúvida num algoritmo que estou a desenvolver de modo a aprender apontadores, o que preciso de fazer é guardar o endereço do apontador assim que encontro um determinado char numa string que percorro se percorrer a string e nenhum char for encontrado o endereço devolvido deverá ser NULL caso contrário deverá devolver o endereço da ultima posição de ch na string.

Pensamento para resolução do problema

Enquanto o valor para o qual apontador aponta neste caso *s != ‘\0’ então deverei ir percorrendo a string caso encontre um char igual a ch o endereço da respetiva posição deverá ser guardado para mais tarde ser retornado.

O problema e que imaginemos se colocar "Banana" 'a' acontece que tenho como valor de retorno um 'a' e não o endereço.

😄

Link to comment
Share on other sites

Ele não devia retornar o número do endereço em vez da letra do género 0x00000... ?

A função retorna um apontador para char mas queria saber se é possível pegar no apontador que ela retorna e fazer com que me mostre o endereço já tentei fazer &strrchr(s, ch) de modo a que me seja retorna o endereço do apontador retornado pela função.

Já agora qual é o problema :|

Se for o retorno de NULL sim ele crasha mas se é o que me pedem no exercício >.<

Edited by fcl-93
Link to comment
Share on other sites

  • Solution

não

o pretendido não é o endereço do ponteiro, até porque isso só faz sentido dentro da função strrchr.

o que é retornado é na realidade o ponteiro para a última posição do caracter pesquisado.

o teu problema é que não estás a usar o melhor método para verificar se a função foi correctamente executada:

(ps : vou escrever código C porque, na realidade, a única coisa de C++ que tens no teu código é o stream de input/output ... que na realidade não é nada ...)

char* pt;
if ((pt = strrchr(s, ch)) != NULL) // procurar pela posição do último caracter 'ch' na string 's'
 *pt = '.'                        // trocar o caracter encontrado pelo caracter ponto

cout << s << endl;                 // verifica se o caracter encontrado foi correctamente alterado
  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

char *strrchr(char *s, char ch)
{
 char *save = new char[]; // <--------------- alocar memória que não só nunca é usada como não irá ser libertada !!!!
 save = NULL;

 for (; *s != '\0'; s++)
 {
   if (*s == ch)
   {
     save = s; // Guarda o endereço de s em save
   }
 }

 // Se save continua a apontar para NULL então retorna Null caso contrário retorna save
 if (*save == NULL)
 {
   return NULL;
 }
 else
 {
   return save;
 }
}

como deveria ser escrita a função:

char *strrchr(char *s, char ch)
{
 if (s == NULL)                   // vou deixar o NULL em vez de trocar por nullptr, como disse, isto é C e não C++
   return NULL;

 char *last = NULL;
 for (; *s != '\0'; s++)
   last = (*s == ch ? s : last);  // flavour, só para minimizar linhas

 return last;
}
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.