Ir para conteúdo

POWERED BY:

Arquivado

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

Everton Wcks

C - Alocação Dinâmica - Estrutura de Dados

Recommended Posts

Boa noite pessoal!!

 

Estou "overclockando" os meus neuronios, para fazer dois exercícios para a facul. Um deles parece ser simples, segue o enunciado:

 

"(1.5) Escreva uma função de protótipo:

void strinv (char s[]);

que inverta os caracteres de uma string. Por exemplo: se a string for “ABCDEF”, deve ser

convertida para “FEDCBA”."

 

Comentários do professor:

 

A idéia aqui é implementar a função "strinv". Note que o parâmetro deve ser "char s[]" (você não deve dimensionar o tamanho de s).

 

Essa função deve fazer o seguinte:

1. Como a função não tem como saber o tamanho do vetor passado em s, ela deve percorrer esse vetor até encontrar '\0' (fim de string). Assim, calculamos o tamanho da string.

2. Alocar dinamicamente um novo vetor "auxVet" com o tamanho apropriado para a string.

3. Usamos "auxVet" para inverter a string de s (percorremos s de trás para frente e armazenamos os caracteres em auxVet)

4. Depois percorremos auxVet e sobrescrevemos o vetor s, com a sequencia invertida (note que a operação precisa ser feita em s, pois a função strinv não retorna valores.

5. Depois de copiar a string invertida para s, devemos liberar a memória de auxVet.

 

OBSERVACAO: é possível realizar a inversao da string "sem alocar outro vetor". Bastaria percorrer s com dois indices: um partido de 0 e outro partindo de n - 1 (n é o tamanho da string). Bastaria ir trocando os caracteres. Mas o meu interesse aqui, é que usemos as funções de alocação dinâmica.

Já pesquisei bastante, mas muitas pessoas fazem utilizando dois vetores e talz, fiz um aqui mas não consigo entender como fazer. Na verdade estou com dúvidas de como usar a lógica e os comando corre

 

Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define size 256

void strinv(char s[size]) {
     int i; 
     char auxVet[size];

     for(i= 0; s[size] != '\0'; i++)
     {

     }

}     

int main(int argc, char *argv[])
{
   int i=0;
   char palavra[256];

   printf("Digite uma palavra:\n");
   scanf("%s", palavra);
   printf("O texto informado eh: %s\n", palavra);



   strinv(palavra);
   printf("O texto invertido eh: %s\n", palavra);

   system("PAUSE");	
   return 0;
}

Alguém poderia me ajudar, explicar o que eu posso fazer, utilizando alocação dinâmica???

 

Obrigado pela ajuda pessoal!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Everton Wcks,

 

No enunciado, fala em alocação dinâmica. Então você não pode fazer isto:

char auxVet[size];

Assim esta alocando de forma estática.

Para alocar dinamicamente utilize o malloc():

char* pcBuffer = (char)malloc(100);

Para percorre esta área alocada utilize o ponteiro retornado dela.

Segue um pseudo-código:

void strinv(char s[]) {
     int iTamanho;
     char* auxVet;
     int iLaco;

     iTamanho = strlen(s);
     auxVet = (char)auxVet(iTamanho);

     for(iLaco = 0; auxVet != 0; iLaco++,auxVet++,iTamanho--)
        *auxVet = s[iTamanho];           
}  

 

- Declara um vetor dinamicamente

- obtém o tamanho da string a ser invertida, através do método strlen()

- Copia o dado do vetor s na posição iTamanho para a posição apontada por auxVert.

 

Não esqueça de armazenar á primeira posição do vetor alocado para não perder os dados.

 

Qualquer dúvida, prende o grito aê!

 

Espero ter ajudado, FLW!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

char* pcBuffer = (char)malloc(100);

 

 

Isso está errado. O correto é isso (em C):

 

char* pcBuffer = malloc(100 * sizeof(char));

 

 

Se estiver usando C++, o correto seria isso:

 

char* pcBuffer = (char *) malloc(100 * sizeof(char));

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Renato,

 

Se estiver usando C++, o correto seria isso:

char* pcBuffer = (char *) malloc(100 * sizeof(char));

 

Em c++, não utilizo o malloc. Uso o operador new para alocar e delete para desalocar memória. Operadores próprios do C++.

 

Isso está errado. O correto é isso (em C):

char* pcBuffer = malloc(100 * sizeof(char));

 

Como eu disse, aquilo é um pseudo-código, não lembrei do sizeof(char).

Consultei este exemplo: http://www.cplusplus.com/reference/clibrary/cstdlib/malloc/

Utilizando o cast antes do malloc, funciona da mesma forma.

 

VLW pela correção!

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em c++, não utilizo o malloc. Uso o operador new para alocar e delete para desalocar memória. Operadores próprios do C++.

 

Também uso o new e delete em C++, é o recomendado, eu tava era mostrando como usar o malloc em C++, pois tem diferenças.

 

Como eu disse, aquilo é um pseudo-código, não lembrei do sizeof(char).

Consultei este exemplo: http://www.cplusplus...cstdlib/malloc/

Utilizando o cast antes do malloc, funciona da mesma forma.

 

O cast não é necessário em C, em C++ é obrigatório, por isso fiz aquela diferença. E o cast que você fez antes tava errado ^^

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal,

Obrigado pelas dicas, me deram uma luz aqui, mas mesmo assim continua apresentando um erro na função. Segue:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void strinv(char s[])
{
     int iTamanho;
     int size; 
     char *auxVet;
     int iLaco;


     for(size = 0; s[size] != '\0'; size++){}

     auxVet = (char*) malloc(size * sizeof(char));

     iTamanho = strlen(s);
     auxVet = (char)auxVet(iTamanho);

     for(iLaco = 0; auxVet != 0; iLaco++,auxVet++,iTamanho--)
     {  
        *auxVet = s[iTamanho];           
     }

     free(auxVet);

}
int main(int argc, char *argv[])
{
   int i=0;
   char palavra[256];

   printf("Digite uma palavra:\n");
   scanf("%s", palavra);
   printf("O texto informado eh: %s\n", palavra);



   strinv(palavra);
   printf("O texto invertido eh: %s\n", palavra);
   //free(palavra);
   system("PAUSE");	
   return 0;
}

Se puderem me ajudar..

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Também uso o new e delete em C++, é o recomendado, eu tava era mostrando como usar o malloc em C++, pois tem diferenças.

 

 

 

O cast não é necessário em C, em C++ é obrigatório, por isso fiz aquela diferença. E o cast que você fez antes tava errado ^^

 

 

Abraços :D

 

Acho que não entendi teu post anterior. Pensei que estava me corrigindo, e fui explicar porque fazia daquela forma. Obrigado por responder, sempre bom saber estas coisas. Alocação dinâmica ainda me deixa com dúvidas as vezes.

 

VLW!

 

Everton Wcks,

 

Se você fizer isto:

for(size = 0; s[size] != '\0'; size++){}    
auxVet = (char*) malloc(size * sizeof(char));

 

Não precisa fazer isto:

iTamanho = strlen(s);
auxVet = (char)auxVet(iTamanho);

 

O for que você fez e o strlen que eu fiz, tem a mesma função. Não há necessidade de fazer as duas coisas, escolha apenas uma delas. A mesma coisa para a alocação, está fazendo coisas a mais nesta parte.

 

Nesta parte:

for(iLaco = 0; auxVet != 0; iLaco++,auxVet++,iTamanho--)
     {  
        *auxVet = s[iTamanho];           
     }

 

De uma pensada, pois você está misturando os tamanhos obtidos. Não esqueça de armezenar o ponteiro que aponta para o inicio da string alocada, senão, você vai perder os dados dela e não vai poder copiar a memória depois.

 

Espero ter ajudado, FLW!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá pessoal!

 

Primeiro, quero agradeçer vocês pela ajuda!

Segue o novo código:

 

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

void strinv(char s[]) 
{
     int i;
     int size; 
     char *auxVet;

     for(size = 0; s[size] != '\0'; size++){};
     auxVet = (char*) malloc(size * sizeof(char));

     for(i = 0; i < size; i++)
     {
         auxVet[i] =  s[size - i - 1]; 
     }                                     

     for(i = 0; i < size; i++)
     {
       s[i] = auxVet[i] ;
     }

     free(auxVet);

}


int main(int argc, char *argv[])
{
   char palavra[256];

   printf("Digite uma String:\n");
   scanf("%s", palavra);
   printf("String digitado: -> %s\n", palavra);
   strinv(palavra);
   printf("String invertida: -> %s\n", palavra);
   system("PAUSE>NULL");	
   return 0;
}

 

Abraços!!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pense numa solução que use apenas um for.

 

Também sugiro que ao invés de sizeof (char), use 1. As duas formas são, por definição, equivalentes.

 

Sempre verifique se malloc não retornou NULL. Caso isso ocorra, tentar de-referenciar o ponteiro que armazenou seu valor de retorno gera undefined behavior.

 

O cast de (void *) para (char *) é desnecessário. Qualquer tipo de ponteiro para objeto é naturalmente convertido para (void *) e vice-versa. De forma geral:

 

T *o = malloc(n * sizeof *o);

if (!o)
{
   // tratamento de erro (geralmente limitado a salvar informações importantes,
   // exibir uma mensagem de erro e encerrar a execução
}
else
{
   // usar o e *o
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

O cast de (void *) para (char *) é desnecessário. Qualquer tipo de ponteiro para objeto é naturalmente convertido para (void *) e vice-versa. De forma geral:

 

Como eu disse, isso é obrigatório em C++, em C não é.

 

Também sugiro que ao invés de sizeof (char), use 1. As duas formas são, por definição, equivalentes.

 

Sim, mas quem sabe daqui a 20 anos não sai uma nova standard que mude o char?

 

hahaha

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

O cast de (void *) para (char *) é desnecessário. Qualquer tipo de ponteiro para objeto é naturalmente convertido para (void *) e vice-versa. De forma geral:

 

Como eu disse, isso é obrigatório em C++, em C não é.

 

Também sugiro que ao invés de sizeof (char), use 1. As duas formas são, por definição, equivalentes.

 

Sim, mas quem sabe daqui a 20 anos não sai uma nova standard que mude o char?

 

hahaha

 

 

Abraços :D

 

Não. A chance de sizeof (char) mudar é a mesma de a de int desaparecer.

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.