Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Ali Awada

C RESOLVIDO assignment makes integer from pointer without a cast

Recommended Posts

Alocação dinamica de uma string em c.

Exercício é o seguinte: Faça um programa que receba do usuário o tamanho de uma string e chame uma função para alocar dinamicamente essa string. Em seguida o usuário deverá informar o conteúdo dessa string. O programa imprime somente as vogais dessa string.

 

O q eu consegui faze até agora: 

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

void alocacao(char *s,int t){
	*s = (char*) malloc(t*sizeof(char));
}

int main(int argc, char** argv)
{
  char *string;
  int tamanhostring;
  int i;
  printf("tamanho da string?");
  scanf("%d", &tamanhostring);
  alocacao(string,tamanhostring);	
  
  printf("conteudo da string?");
  scanf("%s", &string);
  for(i=0;i<tamanhostring;i++)
  {
  	if(string[i]=='a' || string[i]=='e' || string[i]=='i' || string[i]=='o' || string[i]=='u')
  	{
  		printf("%c", string[i]);
	}
  }
  return 0;
 }

Para a execução depois de ler o tamanho da string e da o seguinte [Warning] assignment makes integer from pointer without a cast.

Compartilhar este post


Link para o post
Compartilhar em outros sites
agora, Ali Awada disse:

*s = (char*) malloc(t*sizeof(char));

Sua variável s, como ponteiro recebe a alocação dinamica, então mude apenas para:
s = (char*) malloc(t*sizeof(char));

 

agora, Ali Awada disse:

printf("conteudo da string?"); scanf("%s", &string);

Sua variável 'string' não precisa referenciar o endereço para salvar o input do teclado. Use apenas:
scanf("%s", string);

 

Teste aí! Espero ter ajudado ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora consigo ler a string mas para em seguida 

void alocacao(char *s,int t){
	s = (char*) malloc(t*sizeof(char));
}

colocando o ponteiro no parâmetro s, tira os seguintes warningsCapturar.PNG.9802174f3b5b991b0e355a2563e07a98.PNG

 

tirei o & do scanf string, mas continua nao funcionando...

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
Postado (editado)

Seu código com observações:

 

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

void alocacao(char *s,int t) {
    *s = (char*) malloc(t*sizeof(char)); //Não vai * no s e não use casting no malloc
}

int main(int argc, char** argv)
{
    char *string;
    int tamanhostring;
    int i;
    printf("tamanho da string?");
    scanf("%d", &tamanhostring);
    alocacao(string, tamanhostring);

    printf("conteudo da string?");
    scanf("%s", &string); //string é um ponteiro logo guarda endereços de memória,
                          //logo para obter o endereço não vai & no nome do ponteiro.
  
    for(i=0; i<tamanhostring; i++) //Use o caractere '\0' na i-ésima posição do vetor
    {                              //indicando o fim da string como condição de parada
        if(string[i]=='a' || string[i]=='e' || string[i]=='i' || string[i]=='o' || string[i]=='u')
        {
            printf("%c", string[i]);
        }
    }
    return 0;
}

 

E finalmente faltou liberar a memória que foi alocada dinamicamente, usando free(), SEMPRE deve liberar, de preferência já coloque imediatamente o free correspondente no código toda vez que colocar um malloc, para não esquecer depois...

 

 

Seu código com modificações:

 

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

void alocacao(char *s,int t) {
    s = malloc(t*sizeof(char));
}

int main(int argc, char** argv)
{
    char *string = NULL; //Boa prática de programação sempre inicializar ponteiro
    int tamanhostring;
    int i;
    printf("tamanho da string?");
    scanf("%d", &tamanhostring);
    alocacao(string, tamanhostring);

    printf("conteudo da string?");
    scanf("%s", string);
    for(i=0; i<tamanhostring && string[i] != '\0'; i++)
    {
        if(string[i]=='a' || string[i]=='e' || string[i]=='i' || string[i]=='o' || string[i]=='u')
        {
            printf("%c", string[i]);
        }
    }
    
    free(string); /*NÃO PODE ESQUECER DE LIBERAR MEMÓRIA ALOCADA DINAMICAMENTE.*/
    
    return 0;
}

 

Uma coisa a mais que poderia colocar seria checar que o programa teve sucesso em alocar memória com o malloc (e gerar mensagem de erro e interromper o programa se falhou).

 

Editado por isrnick

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pelas observações e dicas, são realmente necessárias.

To usando o dev c++ e o programa lê o tamanho e a string mas continua parando em seguida.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Postado (editado)

Eu não gostei do nome da sua função! Então fiz um versão turbinada.

#include <stdlib.h>
char *alocar_memoria(char **ref_strings, int t_quantidade)
{
  char *m_strings;
  
  m_strings = NULL;
  if (ref_strings != NULL
  	 && (m_strings = calloc(t_quantidade, sizeof *m_strings)) != NULL)
            *ref_strings = m_strings;
 
  return m_strings;
}

Ainda sim preste atenção nos parâmetro dela !!!! É uma charada para você mesmo descobrir o que errou na sua??

Editado por AnsiC
melhorar a mensagem
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não tá retornando o endereço da memória alocada para o escopo do main()...

 

Ok, modifiquei a lógica para a função retornar:

 

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

char *alocacao(int t) {
    char *s = NULL;
    s = malloc(t*sizeof(char));
    return s;
}

int main(int argc, char** argv)
{
    char *string = NULL; //Boa pratica de programacao sempre inicializar ponteiro
    int tamanhostring;
    int i;
    printf("tamanho da string?");
    scanf("%d", &tamanhostring);
    string = alocacao(tamanhostring);

    printf("conteudo da string?");
    scanf("%s", string);
    for(i=0; i<tamanhostring && string[i] != '\0'; i++)
    {
        if(string[i]=='a' || string[i]=='e' || string[i]=='i' || string[i]=='o' || string[i]=='u')
        {
            printf("%c", string[i]);
        }
    }
    
    free(string); /*NAO PODE ESQUECER DE LIBERAR MEMoRIA ALOCADA DINAMICAMENTE.*/
    
    return 0;
}

 

adicionado 3 minutos depois

Lembre-se que o tamanho da string deve ser do vetor alocado deve ser grande o suficiente para a string caber, ou seja igual o maior que o número de caracteres + 1 (para guardar o caractere nulo '\0' indicando o fim).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Podemos passa pelo parâmetro o endereço do ponteiro. E também fiz outras mudanças vejam.

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

void alocacao(char **refs, int t)
{
  *refs = (char *) malloc(t*sizeof(char));
}

int main(void)
{
  int  i, vogc;
  int  tstring; /* tamanho do strings */
  char *string;

  printf("tamanho da string?");
  scanf("%d", &tstring);

  alocacao(&string, tstring);

  printf("conteudo da string?");
  scanf("%s", string);

  for (i = 0; i < tstring; i++) {
    for (vogc = 0; vogc < 10; vogc++) {
      if ("aeiouAEIOU"[vogc] == string[i]) {
        putchar("aeiouAEIOU"[vogc]);
        break;
  } } }
  free((void *)string);
  return 0;
}

 

adicionado 12 minutos depois
17 horas atrás, isrnick disse:

Uma coisa a mais que poderia colocar seria checar que o programa teve sucesso em alocar memória com o malloc (e gerar mensagem de erro e interromper o programa se falhou).

Exatamente, um função que só retorna o ponteiro e um tanto inútil, pois poderia por exemplo chamar malloc dentro da main. Faz muito mais sentido implementações que tenha por objeto aprimorar o uso de malloc.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×