Ir ao conteúdo

C assignment makes integer from pointer without a cast


Ir à solução Resolvido por Ansi C,

Posts recomendados

Postado

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.

Postado
  Em 05/07/2018 às 22:03, Ali Awada disse:

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

Expandir  

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

 

  Em 05/07/2018 às 22:03, Ali Awada disse:

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

Expandir  

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

Postado

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

 

Postado

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

 

Postado

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.

Postado

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
Postado

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

  • Solução
Postado

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
  Em 05/07/2018 às 22:56, 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).

Expandir  

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

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

Mostrar 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

Mostrar mais  
×
×
  • Criar novo...

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

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!