fcl-93 Posted March 29, 2015 at 10:08 AM Report Share #580416 Posted March 29, 2015 at 10:08 AM #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 More sharing options...
HappyHippyHippo Posted March 29, 2015 at 10:22 AM Report Share #580418 Posted March 29, 2015 at 10:22 AM não estou a ver o problema ... o código (se bem que tem um problema) executa o que pretendes ... 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
fcl-93 Posted March 29, 2015 at 10:26 AM Author Report Share #580419 Posted March 29, 2015 at 10:26 AM (edited) 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 March 29, 2015 at 10:29 AM by fcl-93 Link to comment Share on other sites More sharing options...
Solution HappyHippyHippo Posted March 29, 2015 at 10:32 AM Solution Report Share #580420 Posted March 29, 2015 at 10:32 AM 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 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
fcl-93 Posted March 29, 2015 at 10:41 AM Author Report Share #580422 Posted March 29, 2015 at 10:41 AM Obrigado já percebi 😄👍 Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 29, 2015 at 10:44 AM Report Share #580423 Posted March 29, 2015 at 10:44 AM o código (se bem que tem um problema) ainda existe algo que deverias corrigir IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
fcl-93 Posted March 29, 2015 at 11:01 AM Author Report Share #580425 Posted March 29, 2015 at 11:01 AM Tive 15 min a olhar para aquilo o que tou a fazer de mal? Ou melhor o que é necessário corrigir Oo Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 29, 2015 at 11:18 AM Report Share #580428 Posted March 29, 2015 at 11:18 AM 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 Portugol Plus Link to comment Share on other sites More sharing options...
fcl-93 Posted March 29, 2015 at 12:30 PM Author Report Share #580432 Posted March 29, 2015 at 12:30 PM (edited) Muito obrigado faltou o 'delete' esse pormenor. Eu estou a fazer exercícios para treino de uma cadeira que é "Estruturas de dados e algoritmos" ainda estou no inicio, muito obrigado pela ajuda 😄 Edited March 29, 2015 at 12:31 PM by fcl-93 Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now