Ir ao conteúdo
  • Cadastre-se
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

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

 

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

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

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

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

×