Jump to content

Erro em vector de strings


Recommended Posts

Posted

Olá pessoal desculpem incomodar..no entanto estou a dar os primeiros passos em c..e estou com dificuldades nos arrays!!

quero devolver um array mas esta dando erro:

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

char verifica (float num);

main ()
{
      
     char vetor1 [10];
     int num;
     printf ("por favor introduza a idade do nadador");
     scanf ("%d", &num);
     vetor1= verifica (num);
     printf (" o nadador e do nivel %c\n\n", vetor1);
     
     system ("pause");
     
}

char verifica (int num)
{
      char vetor [10]="infantilA";
      char vetor2 [10]="infantilB";
      if(num>=5 && num<=7)
      return vetor;
      if(num>=5 && num<=11)
      return vetor2;
      else
      {
      printf ("erro ao inserir numero");
      
      }
  }

aguardo ajuda..

grato por tudo!!!

Posted

primeiro a tua funcao esta' a retornar um char e nao um apontador para um array de char e tens que alocar memoria para ser retornada.

mete a main com o tipo inteiro: int main(); e a retornar um valor

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Posted

Tens vários erros no código:

1. As variáveis 'vector' e 'vector2' são locais à função 'verifica', o que significa que após a execução dessa função terminar as mesmas terão um conteúdo desconhecido e devem ser consideradas destruídas. Logo não podes tentar passar ponteiros para elas para fora da função (que não é o que fazes, mas o que tentas).

2. Em C não podes atribuir um array a outro com o operador '='. Tens de copiar o conteúdo dum para o outro, em bloco usando a função 'memcpy' para arrays que não contenham strings ou a função 'strcpy' para arrays contendo strings.

3. Caso uma função retorne algo deves sempre garantir que retornas algo definido, qualquer que seja o ponto de saída da função. Na tua 'verifica' não especificas um valor de retorno no caso de 'num' não estar entre 5 e 11.

Posted

tens varios erros ai:

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

char verifica (float num); //tens que por int, para ser igual 'a implementacao da funcao que esta em baixo
                                      //tambem queres retornar um array de chars, entao tens que meter como char* em vez de char
main ()   //tens que ter int main, nao e obrigatorio, mas e' uma boa pratica
{
     
     char vetor1 [10];
     int num;
     printf ("por favor introduza a idade do nadador");
     scanf ("%d", &num);
     vetor1= verifica (num);   //a menos que sejam os 2 apontadores nao podes fazer isto, usa o strcpy
     printf (" o nadador e do nivel %c\n\n", vetor1);   //queres imprimir uma "string" entao tens que meter %s em vez de %c
     
     system ("pause");
     //tens que returnar da funcao main
}

char verifica (int num)  //mesmo de ali de cima, ja agora tens que indentar melhor o codigo
{
      char vetor [10]="infantilA";
      char vetor2 [10]="infantilB"; 
      if(num>=5 && num<=7)
      return vetor;    //estas a retornar um array
      if(num>=5 && num<=11)
      return vetor2;
      else
      {
      printf ("erro ao inserir numero");
     
      }
  }

na funcao verifica, tens que criar um apontador e allocar memoria com o malloc e depois retornas esse valor para a main

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Posted

se tiveres com duvida quanto ao malloc, e' algo assim:

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

char* returnPalavra()
{
//char palavra[10]="alguma coisa";
//return palavra; //ERRADO!!!!
     
char* pStr;
pStr=(char*)malloc(strlen("alguma coisa"));
strcpy(pStr,"alguma coisa");
return pStr;
}

int main ()
{

     printf("%s",returnPalavra());
     return 1;
}

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Posted

ja alterei mas dá na mesma erro:-((

e entretanto,assim como coloquei no strcpy nunca imprime o vetor 2:-((

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

char vetor [10]="infantilA";
char vetor2 [10]="infantilB";
char vetor1 [10];

char* verifica (int num); //tens que por int, para ser igual 'a implementacao da funcao que esta em baixo
                                      //tambem queres retornar um array de chars, entao tens que meter como char* em vez de char
int main ()   //tens que ter int main, nao e obrigatorio, mas e' uma boa pratica
{
     
   
     int num;
     printf ("por favor introduza a idade do nadador");
     scanf ("%d", &num);
     strcpy(vetor1, vector);
     //vetor1= verifica (num);   //a menos que sejam os 2 apontadores nao podes fazer isto, usa o strcpy
     printf (" o nadador e do nivel %s\n\n", vetor1);   //queres imprimir uma "string" entao tens que meter %s em vez de %c
     
     system ("pause");
     return 0;//tens que returnar da funcao main
}

char* verifica (int num)  //mesmo de ali de cima, ja agora tens que indentar melhor o codigo
{
       
      if(num>=5 && num<=7)
      return vetor;    //estas a retornar um array
      if(num>=5 && num<=11)
      return vetor2;
      else
      {
      printf ("erro ao inserir numero");
     
      }
  }

mas também nao funciona

Posted

Se optares por variaveis globais a logica da funcao muda, porque que nao ficas com um unico vector  e quando chamares a funcao verifica() nao mudas so o valor do vector?

Se estas a usar variaveis globais nao persisas que a funcao retorne valor nenhum, apenas que mude o valor da var global, ou tambem podes returnar um indice.

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Posted

se tiveres com duvida quanto ao malloc, e' algo assim:

#include<stdio.h>
#include<string.h>
pStr=(char*)malloc(strlen("alguma coisa"));

Excepto que o cast é, na melhor das hipóteses, redundante. E pode (como é o caso aqui) esconder um erro para o qual o compilador apontaria se não houvesse cast em primeiro lugar.

Em suma: não faças cast ao valor devolvido pelo malloc.

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted

Excepto que o cast é, na melhor das hipóteses, redundante. E pode (como é o caso aqui) esconder um erro para o qual o compilador apontaria se não houvesse cast em primeiro lugar.

Em suma: não faças cast ao valor devolvido pelo malloc.

nao sabia... estou mais habituado aos new de c++ 😛

Pois!!

eu preferia variaveis locais mas da erro por todo o lado!!

Com variaveis locais como fica o strpcy??

Mais uma vez obrigado!!

ve o exemplo que eu pos:

#include<stdio.h>
#include<stdlib.h> /* malloc */
#include<string.h>

char* returnPalavra()
{
        //char palavra[10]="alguma coisa";
        //return palavra; //ERRADO!!!!
     
        char* pStr;
        pStr=malloc(12);  //o 12 e' o numero de bytes(neste caso caracteres) que queres alocar
        strcpy(pStr,"alguma coisa");
        return pStr;
}

int main ()
{

     printf("%s",returnPalavra());
     return 1;
}

ja' agora "Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!"

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Posted

Convem lembrar que

ptr = malloc(strlen("alguma coisa"));
strcpy(ptr, "alguma coisa");

falha por um byte.

A string "alguma coisa" precisa de 13 bytes, mas o seu comprimento é 12. O '\0' também pertence.

Assim seria melhor

ptr = malloc(strlen("alguma coisa") + 1);
strcpy(ptr, "alguma coisa");

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted

Convem lembrar que

ptr = malloc(strlen("alguma coisa"));
strcpy(ptr, "alguma coisa");

falha por um byte.

A string "alguma coisa" precisa de 13 bytes, mas o seu comprimento é 12. O '\0' também pertence.

Assim seria melhor

ptr = malloc(strlen("alguma coisa") + 1);
strcpy(ptr, "alguma coisa");

pois esqueci-me do '\0' :/

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Posted

agora tenho assim:

dá logo erro na declaração da função:-((

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


char* verifica (int num); 
                                    
int main ()  
{
     
   
     int num;
     printf ("por favor introduza a idade do nadador");
     scanf ("%d", &num);
     
     printf("%s",verifica());
     return 1;
     
}   
    

char* verifica (int num)  //mesmo de ali de cima, ja agora tens que indentar melhor o codigo
{
      char* pStr;
      pStr=malloc(11); 
      if(num>=5 && num<=7)
      {
       strcpy(pStr,"infantil A");
       return pStr;        
      }    
      if(num>=5 && num<=11)
      {
        strcpy(pStr,"juvenil A");
       return pStr;         
      }
      else
      {
      printf ("erro ao inserir numero");
     
      }
  }
  
Posted

o tas a chamar a funcao sem o argumento: printf("%s",verifica(num));

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

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


char* verifica (int num); 
                                    
int main ()  
{
     
   
     int num;
     printf ("por favor introduza a idade do nadador");
     scanf ("%d", &num);
     
     printf("%s",verifica());
     return 1;
     
}

Repara nas linhas assinaladas ... nao achas que falta alguma coisa na segunda linha?

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted

continua a dar no malloc!!

da este erro: 26 C:\Users\Proprietario\Desktop\lol.cpp invalid conversion from `void*' to `char*'

cpp? ???? Estás no quadro errado.

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.