Ir para o conteúdo
ricardoneves93

Dúvida sobre passagem de parametros em c

Mensagens Recomendadas

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

Editado por ricardoneves93

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Editado por ricardoneves93
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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 :)

Editado por ricardoneves93

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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;
}

Editado por 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Editado por ricardoneves93

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Editado por 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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));

Editado por 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.