Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

ricardoneves93

Dúvida sobre passagem de parametros em c

Recommended Posts

ricardoneves93

Boa noite, estou com o seguinte problema, tenho a seguinte função:

char* arrangeDate(char *date)

{ ......................

......................

......................

.....................

}

e chamo esta função da seguinte forma:

char dateAfter[26];

arrangeDate(*dateAfter);

não sei o que estou a fazer de errado, a função arrangeDate recebe um apontador para char, que é exactamente o que eu mando como parametro que no fundo é o mesmo que dateAfter[0], um apontador para o inicio da "string".

Edited by ricardoneves93

Share this post


Link to post
Share on other sites
pmg

Nope!

*dateAfter é um valor de tipo char (igual a dateAfter[0]).

Para mandares um apontador para o primeiro elemento do array dateAfter, usa o identificador propriamente dito (um array normalmente é convertido para um ponteiro para o seu primeiro elemento)

arrangeDate(dateAfter);


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!

Share this post


Link to post
Share on other sites
ricardoneves93

Nope!

*dateAfter é um valor de tipo char (igual a dateAfter[0]).

Para mandares um apontador para o primeiro elemento do array dateAfter, usa o identificador propriamente dito (um array normalmente é convertido para um ponteiro para o seu primeiro elemento)

arrangeDate(dateAfter);

Já funciona e compila. Porém a correr está-me a dar segmentation fault, será que estou a aceder ao uma parte fora do Array?

Share this post


Link to post
Share on other sites
ricardoneves93

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>


// This function write to the txt file the dates
void writeTxt(char* date, char* argv[] )
{
int bckpinfoFD;
bckpinfoFD = open("_ _bckpinfo_ _",O_WRONLY | O_CREAT | O_APPEND, 0644);
if(bckpinfoFD == -1)
{
printf("%s","Errado");
perror(argv[1]); // No such file or directory
close(bckpinfoFD);
}
if (write(bckpinfoFD, date, 25) <= 0)
{
printf("%s","Errado2");
perror(argv[1]);
close(bckpinfoFD);
}
}
char* arrangeDate(char *date)// FUNÇÃO EM QUESTÃO
{
//char *newWeekDay[3];
char newMonth[3];
char year[4];
char month[2];
char day[2];
char hour[2];
char minute[2];
char second[2];
char formatedDate[20]; //devia ser 19


//strncpy(newWeekDay, data, 2);
strncpy(newMonth, date+4, 6);
strncpy(year, date+20, 23);
strncpy(day, date+8, 9);
strncpy(hour, date+11, 12);
strncpy(minute, date+14, 15);
strncpy(second, date+16, 17);
if(strcmp(newMonth,"Jan") == 0)
strcpy(month,"01");
if(strcmp(newMonth,"Feb") == 0)
strcpy(month,"02");
if(strcmp(newMonth,"Mar") == 0)
strcpy(month,"03");
if(strcmp(newMonth,"Apr") == 0)
strcpy(month,"04");
if(strcmp(newMonth,"May") == 0)
strcpy(month,"05");
if(strcmp(newMonth,"Jun") == 0)
strcpy(month,"06");
if(strcmp(newMonth,"Jul") == 0)
strcpy(month,"07");
if(strcmp(newMonth,"Aug") == 0)
strcpy(month,"08");
if(strcmp(newMonth,"Sep") == 0)
strcpy(month,"09");
if(strcmp(newMonth,"Oct") == 0)
strcpy(month,"10");
if(strcmp(newMonth,"Nov") == 0)
strcpy(month,"11");
if(strcmp(newMonth,"Dec") == 0)
strcpy(month,"12");

strcat(formatedDate,year);
strcat(formatedDate,"_");
strcat(formatedDate,month);
strcat(formatedDate,"_");
strcat(formatedDate,day);
strcat(formatedDate,"_");
strcat(formatedDate,hour);
strcat(formatedDate,"_");
strcat(formatedDate,minute);
strcat(formatedDate,"_");
strcat(formatedDate,second);

return *formatedDate;
}

int main(int argc, char *argv[])
{
int status;
struct stat sb; // struct to acess the inode
stat(argv[1],&sb); // goes to the file in the first argument
char dateBefore[26];
char dateAfter[26];
char formatedDate[18];
strcpy(dateBefore, ctime(&sb.st_mtime));
printf("Last file modification: %s", dateBefore);
status = mkdir("Backup",S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);//cria pasta Backup em
if(status == -1)
{
printf("%s","Errado3");
perror(argv[2]);
}
//sleep(2);
while(1)
{
stat(argv[1],&sb); // goes to the file in the first argument
strcpy(dateAfter,ctime(&sb.st_mtime));
if(strcmp(dateBefore,dateAfter) != 0) // Se as strings forem diferentes
{
//ficheiros foram modificados
printf("Last file modification: %s", dateAfter);
strcpy(formatedDate,arrangeDate(dateAfter)); //CHAMADA Á FUNÇÃO
//write(formatedDate,argv);
writeTxt(formatedDate,argv);
strcpy(dateBefore,dateAfter);
}

}
return 0;
}

Está um pouco confuso...

ps: Como coloco o codigo em formato de c aqui no forum?

Edited by ricardoneves93
GeSHi

Share this post


Link to post
Share on other sites
pmg

Como coloco o codigo em formato de c aqui no forum?

Mete o código delimitado por [ code=c ] e [ /code ], sem os espaços.

Se quiseres meter código ... sei lá ... java, mete [ code=java ] e [ /code ], sem os espaços.

A função strncpy() não funciona como tu imaginas que ela funciona.

Lê bem a documentação ...

PS: em vez do ctime() não seria melhor usares o strftime()? :)


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!

Share this post


Link to post
Share on other sites
ricardoneves93

Segundo o meu ponto de vista a função char *strcpy(char *dest, const char *src); Recebe como parametros dois apontadores para char que neste caso são um apontador para o inicio da string de destino e um apontador para o inicio da string fonte.

Eu acho que não dá para usar a função strftime() porque eu não quero obter a hora actual mas sim uma data de modificação de um ficheiro. Penso que com a struct tm não o consigo fazer. Porém se houver maneira aceito sugestões :)

Edited by ricardoneves93

Share this post


Link to post
Share on other sites
pmg

Segundo o meu ponto de vista a função char *strcpy(char *dest, const char *src);

Eu chamei a atenção para a função strncpy() (com um N no meio) ...

char newMonth[3];
//...
strncpy(newMonth, date+4, 6); // Oops, big big OOPS

Eu acho que não dá para usar a função strftime() porque eu não quero obter a hora actual mas sim uma data de modificação de um ficheiro. Penso que com a struct tm não o consigo fazer. Porém se houver maneira aceito sugestões :)

A função ctime() devolve uma string que depois copias para um lado qualquer. OK!

A função strftime() mete a data formatada como pretendes num lado qualquer directamente.

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

int main(void) {
 char ladoqualquer[100]; /* espaco "suficiente"! */
 time_t x;
 x = time(NULL);

 strcpy(ladoqualquer, ctime(&x));
 printf("with    ctime: [%s]\n", ladoqualquer);

 strftime(ladoqualquer, sizeof ladoqualquer, "%Y-%m-%d %H:%M:%S", localtime(&x));
 printf("with strftime: [%s]\n", ladoqualquer);
 return 0;
}

Edited by pmg

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!

Share this post


Link to post
Share on other sites
ricardoneves93

Mais uma pergunta, esta função devia modificar um certo caracter de uma string:

char *formatDate(char *date)
{
int i;
for(i = 0; i<sizeof date; i++)
{
 if(*(date+i)==':' || *(date+i)==' ' || *(date+i)=='-')
 {
  *(date+i) = 'a';
 }

}
 printf("Last modification formated:		%s\n", date);
}

porém não o está fazer está a deixa-la completamente igual... tive a reparar a função sizeof diz que o tamanho só vai até ao 1ª ifen

por exemplo:

2013-03-26 21:05:57, o sizeof() so vai percorrer 2013.

Edited by ricardoneves93

Share this post


Link to post
Share on other sites
pmg

No teu codigo date é um ponteiro.

O tamanho dum ponteiro nao tem relacao com o tamanho daquilo para o qual ele aponta.

Uma string é a parte inicial de um array até ao primeiro byte com valor 0.

Mesmo sabendo o tamanho do array associado a string, isso nao indica o tamanho da string.

Para saber o tamanho duma string, usa strlen().

Nota: por motivos de performance, se tiveres de calcular o comprimento da string noutros lados, aproveita essa calculo em vez de estares a re-calcular desnecessariamente.

Edited by pmg

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!

Share this post


Link to post
Share on other sites
pmg

Em vez desta funcao formatDate() porque nao constrois o strftime() com o formato desejado? :)

   strftime(ladoqualquer, sizeof ladoqualquer, "%Ya%ma%da%Ha%Ma%S", localtime(&x));

Edited by pmg

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!

Share this post


Link to post
Share on other sites

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

×

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.