Ir ao conteúdo
  • Cadastre-se

C assignment makes integer from pointer without a cast


Ali Awada
Ir à solução Resolvido por Ansi C,

Posts recomendados

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.

Link para o comentário
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 ;)

Link para o comentário
Compartilhar em outros sites

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).

 

Link para o comentário
Compartilhar em outros sites

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??

  • Curtir 1
Link para o comentário
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).

Link para o comentário
Compartilhar em outros sites

  • Solução

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
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!