1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Pointers em C

Discussão em 'Programação' iniciada por Simao, 18 de Outubro de 2006. (Respostas: 27; Visualizações: 1162)

  1. Simao

    Simao Power Member

    Tenho aqui uma duvida em C....

    Se eu fizer:
    Código:
    char *rStr = "";
    strcpy(rStr,&str1[i]);	
    
    O que eu quero fazer, funciona, ou seja copiar o caracter do str1 para a posição de memoria apontada por rStr.
    Mas se eu fizer:

    Código:
    char *rStr;
    strcpy(rStr,&str1[i]);	
    
    Ja nao bule, alguem sabe pk?

    Obrigado
     
  2. tens q alocar espaço para o rStr

    usa o malloc
     
  3. Simao

    Simao Power Member

    Com que tamanho?
    É isso que nao sei....

    Outra coisa....

    Eu tenho uma função:
    Código:
    char* substr(char* str1, int from)
    {
    	char *rStr = "";
    	unsigned int i;
    	for (i = from; i < strlen(str1) ; i++)
    	{
    		strcpy(rStr,&str1[i]);		
    	}
    	
    	return rStr;
    }
    
    Em principio o que tou a fazer é retornar um apontador para uma variavel local? Eu posso fazer isso? É que ta a dar pa retornar, n retorna eh o ke eu kero mas isso eh outra historia.

    Obrigado
     
  4. manta

    manta Power Member

    podes alocar logo o esaço sem malloc fazendo algo do genero
    char rStr[30]
    rStr[0]="\0" -incialização da string
    Em c tens de alocar logo a memoria que precisas e a maneira mais simples.

    O ciclo está a devolver o apontador para a ultima posição da string que é "\0" ou seja e provavel que nao vejas nada no output.
     
  5. Simao

    Simao Power Member

    Pois eu ja experimentei isso, e da-me:
    distance.c:26: warning: return from incompatible pointer type
    distance.c:26: warning: function returns address of local variable

    Eu percebo o que ele diz....n percebo é pk eh ke n diz o mm se eu fizer km tava a fazer
     
  6. Simao

    Simao Power Member

    Código:
    char* substr(char* str1, int from)
    {
    	char rStr[30];
    	rStr[0] = '\0';
    	unsigned int i;
    	for (i = from; i < strlen(str1) ; i++)
    	{
    		rStr[strlen(rStr)] = str1[i];
    		rStr[strlen(rStr)] = '\0';
    	}
    	
    	return rStr;
    }
    
    Da-me:

    distance.c:28: warning: function returns address of local variable

    E dps n funciona

    Se eu fizer:
    Código:
    char* substr(char* str1, int from)
    {
    	char * rStr = malloc(sizeof(char)*30);
    	rStr[0] = '\0';
    	unsigned int i;
    	for (i = from; i < strlen(str1) ; i++)
    	{
    		rStr[strlen(rStr)] = str1[i];
    		rStr[strlen(rStr)] = '\0';
    	}
    	
    	return rStr;
    }
    
    N da erro, mas tb n faz o ke eu kero.

    Tenho que usar uma variavel global para me guardar a string? Ou melhor, um "Apontador Global"?
     
  7. Simao

    Simao Power Member

    ok... eu resolvi o problema:
    Código:
    void substr(char* str1, int from, char* to)
    {
    	unsigned int i;
    	for (i = from; i < strlen(str1) ; i++)
    	{
    		to[strlen(to)] = str1[i];
    		to[strlen(to)] = '\0';
    	}
    	
    }
    
    Ou seja, eu dei a funçao, um endereço onde guardar o valor calculado. Isto funciona.

    Mas n ha maneira de ela retornar de facto o endereço de uma string, ou uma string, para o resultado, ou seja, em vez de void, char * ou assim?

    Obrigado
     
  8. alph

    alph Power Member

    Repara que o teu programa está algo ineficiente, podias preencher a string e só no final do for é que inserias o terminador \0. Escusas de estar a inseri-lo todos os passos do ciclo, e mesmo ao início. :)

    E em vez de chamares strlen a todos os passos do ciclo, podes muito bem obter a posição que queres com a seguinte operação: i - from.

    Haver maneira, há, experimenta usar a segunda função (a que retorna char*) com estas sugestões, a ver o que te dá.
     
  9. Simao

    Simao Power Member


    Bem visto, obrigado. Ja fiz isso.

    Agora fikei na duvida foi qt ao retorno da função...
     
  10. alph

    alph Power Member

    Eu editei o meu post, vê lá o último parágrafo. ;)
     
  11. manta

    manta Power Member

    sim tens de usar uma variavel global ou então fazer algo do genero

    teste=substr(str,4)
    tendo o teste sido definido com uma string
    ou seja em vez de passares como parammetro como fizeste no outro post

    e acho com este codigo estas sempre a retorna a string vazia
    to[strlen(to)] = str1;
    to[strlen(to)] = '\0';
     
  12. alph

    alph Power Member

    Pode ser devolvido como resultado da função, desde que reserve a memória com o malloc.
     
  13. Simao

    Simao Power Member

    Bem ele n da erro... mas tb n funciona..da null a substr
     
  14. alph

    alph Power Member

    Mostra como ficou o código final. ;)
     
  15. Simao

    Simao Power Member

    Bem ja consegui, obrigado pela ajuda.

    Entao o erro tava em nao usar o malloc eh isso? Se eu usar o malloc posso passar a informaçao assim?
     
  16. Simao

    Simao Power Member

    Código:
    char *substr(char* str1, int from)
    {
    	char *rStr = malloc(sizeof(char)*30);
    	unsigned int i;
    	for (i = from; i < strlen(str1) ; i++)
    		rStr[i-from] = str1[i];
    	
    	rStr[i-from] = '\0';
    	
    	
    	return rStr;
    }
    
    =)
     
  17. alph

    alph Power Member

    Exacto. Se não usares o malloc, ele cria-te à mesma um espaço para guardares uma string, e direcciona o apontador para lá, porém apaga esse mesmo espaço quando sais da função.

    O malloc cria-te espaço dinamicamente no heap e permite usar até que chames (e convém para projectos maiores, senão ocorrem perdas de memória - memory leaks) a função free, tipo free(rStr). Isso liberta o espaço anteriormente reservado pelo malloc.

    E é assim a magia de C. :)

    Um aparte, que provavelmente acharás interessante, podes ainda substituir o loop por este:
    Código:
    i = from;
    while(rStr[i-from] = str1[i++]);
    Poupas a chamada à função strlen, e torna o código mais l33t, mas isto é só uma curiosidade. :)
     
    Última edição: 18 de Outubro de 2006
  18. Simao

    Simao Power Member

    Se nao usar o malloc ele usa a stack certo? Por isso eh k dps deixa de existir....
     
  19. alph

    alph Power Member

    Right-o. ;)
     
  20. TuxBoss

    TuxBoss Power Member

    Só uma coisa, o máx de caracteres que str1 tem é 30? É que se não for devias fazer o malloc com sizeof(char)*strlen(str1) em vez de 30 ou arriscas-te a SEGFAULT's.
    Outra coisa, se o from puder ser 0, aconselhava-te a fazer um if do tipo...
    Código:
    if ( from == 0) 
       strncpy(str1,rstr,strlen(str1)); //tou a fazer de cabeça
    else
        for(...)...
    
    Previne ciclos desnecessários.
     

Partilhar esta Página