Ajuda com alocação de memória dinâmica em C++ [RESOLVIDO]

1. Ajuda com alocação de memória dinâmica em C++ [RESOLVIDO]

Bruno Santos
br95st

(usa Outra)

Enviado em 03/06/2017 - 14:17h

Olá pessoal,

Estou com um problema na execução do código abaixo, o programa deveria receber vários caracteres e imprimi-lós do ultimo ao primeiro isso ele até faz isso porem ele imprime um espaço e a letra p no final, não sei o que possa esta causando isso.

#include<iostream>
#include<cstring>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

using namespace std;

int main(){
char *qual;
qual = (char *) malloc(sizeof(char));

cout<<"Digite qualquer nome >> ";
gets(qual);

for(int i=sizeof(qual);i>=0;i--)
{
cout<<qual<<endl;
}

getchar();
return 0;
}


será que alguém pode me ajudar?


  


2. Re: Ajuda com alocação de memória dinâmica em C++ [RESOLVIDO]

Uilian Ries
uilianries

(usa Linux Mint)

Enviado em 03/06/2017 - 15:44h

Nesta linha você pediu para o compilador alocar o tamanho de char e atribui para qual:

qual = (char *) malloc(sizeof(char)); 


Nesse momento você só tem espaço para guardar 1 caractere.
Se você quer receber um conjunto de caracteres, precisa informar a quantidade desejada. Suponhamos que o nome poderá conter até 256 caracteres:

qual = (char *) malloc(sizeof(char) * 256); 


Nesta linha você solicita ao sistema, ler um conjunto de caracteres e armazená-los em qual:

gets(qual); 


qual só possui espaço para guardar um caractere, logo, você estará limitado nesse ponto.
Por segundo, você solicitou a leitura através da função gets. Essa função não é recomendada e foi obsoletada. Se ler o manual dele, irá encontrar o seguinte trecho:

$ man gets
...
BUGS
Nunca use gets(). Porque é impossível dizer sem saber com antecedência a quantidade de caracteres que gets() vai ler, e porque gets() continuará a armazenar caracteres após o final do buffer, é extremamente perigoso usar. Ele já foi usado para quebrar a segurança de computadores. Use fgets () em vez disso.


Você pode optar por fgets, ou até std::cin:

if (fgets (qual, 256, stdin) == NULL) { // ERRO } 


Em geral, essas funções possuem algum retorno para validar a execução. Use isso ao seu favor.
E por que eu usei 256 ao invés de sizeof(qual)? sizeof apenas irá resolver o tamanho de qual, ou seja, o tamanho de char*. Para saber o tamanho da string, existe a função strlen.

E por fim temos a iteração de i até o inicio do nome.

for(int i=sizeof(qual);i>=0;i--) {
cout<<qual<<endl;
}


Cada iteração imprime qual, mas você deseja imprimir o caractere que compõem o índice de i:

for(int i=sizeof(qual) - 1;i>=0;i--) {
cout<<qual[ i ]<<endl;
}


Se você está estudando C++, recomendaria utilizar std::string ao invés de alocar manualmente qual. Se estiver estudando alocação de memória em C++, prefira o operador new:

char * qual = new char[256];
...
delete [] qual;


Neste exemplo eu utilizei o operador delete para devolver a memória alocada. No seu código deveria ser utilizado a função free:

free(qual); 




3. Ajuda com alocação de memória dinâmica em C++

Bruno Santos
br95st

(usa Outra)

Enviado em 03/06/2017 - 16:46h

Obrigado!

suas sugestões deram certo, segue como ficou:

#include<iostream>
#include<string.h>

using namespace std;

int main()
{
char *qual = new char[20];
int x = strlen (qual);

cout<<"Digite qualquer coisa >> ";
fgets(qual, 20, stdin);

for(int i = x+1;i>=0;i--)
{
cout<<qual[i];
}
delete [] qual;

getchar();
return 0;
}

As sugestões em relação ao malloc eu já havia tentado só que não funcionou.








Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts