ricardoneves93 Posted March 25, 2013 at 11:24 PM Report #500386 Posted March 25, 2013 at 11:24 PM (edited) 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 March 25, 2013 at 11:24 PM by ricardoneves93 http://www.speedtest.net/result/2682095343.png
pmg Posted March 25, 2013 at 11:33 PM Report #500388 Posted March 25, 2013 at 11:33 PM 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!
ricardoneves93 Posted March 25, 2013 at 11:39 PM Author Report #500390 Posted March 25, 2013 at 11:39 PM 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? http://www.speedtest.net/result/2682095343.png
AJBM Posted March 25, 2013 at 11:46 PM Report #500392 Posted March 25, 2013 at 11:46 PM Boas! Podes postar o codigo
ricardoneves93 Posted March 25, 2013 at 11:53 PM Author Report #500393 Posted March 25, 2013 at 11:53 PM (edited) #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 March 26, 2013 at 09:20 AM by ricardoneves93 GeSHi http://www.speedtest.net/result/2682095343.png
AJBM Posted March 26, 2013 at 12:05 AM Report #500394 Posted March 26, 2013 at 12:05 AM Sim, o que tu queres fazer com a função arrangeDate podes dar um exemplo?
ricardoneves93 Posted March 26, 2013 at 12:33 AM Author Report #500397 Posted March 26, 2013 at 12:33 AM (edited) a funçao arrangeDate recebe uma String do tipo "Sun Sep 16 15:30:00 2013" e transformar em year_month_day_hours_minutes_seconds como por exemplo "2013_09_16_15_30_00" Edited March 26, 2013 at 12:46 AM by ricardoneves93 http://www.speedtest.net/result/2682095343.png
pmg Posted March 26, 2013 at 09:15 AM Report #500409 Posted March 26, 2013 at 09:15 AM 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!
ricardoneves93 Posted March 26, 2013 at 09:28 AM Author Report #500410 Posted March 26, 2013 at 09:28 AM (edited) 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 March 26, 2013 at 09:29 AM by ricardoneves93 http://www.speedtest.net/result/2682095343.png
pmg Posted March 26, 2013 at 10:03 AM Report #500415 Posted March 26, 2013 at 10:03 AM (edited) 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 March 26, 2013 at 10:04 AM 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!
ricardoneves93 Posted March 26, 2013 at 11:01 AM Author Report #500428 Posted March 26, 2013 at 11:01 AM Sem duvida ficou mais facil 😉 Ainda nao está 100% mas agora é problema do meu código...Obrigado http://www.speedtest.net/result/2682095343.png
ricardoneves93 Posted March 26, 2013 at 09:18 PM Author Report #500530 Posted March 26, 2013 at 09:18 PM (edited) 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 March 26, 2013 at 09:22 PM by ricardoneves93 http://www.speedtest.net/result/2682095343.png
pmg Posted March 26, 2013 at 09:22 PM Report #500531 Posted March 26, 2013 at 09:22 PM (edited) 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 March 26, 2013 at 09:30 PM 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!
ricardoneves93 Posted March 26, 2013 at 09:28 PM Author Report #500532 Posted March 26, 2013 at 09:28 PM Obrigado, não sabia esse pormenor, problema resolvido 🙂 Depois quando perceber bastante disto, também já vou poder ajudar o pessoal aqui do forum 👍 http://www.speedtest.net/result/2682095343.png
pmg Posted March 26, 2013 at 09:32 PM Report #500533 Posted March 26, 2013 at 09:32 PM (edited) 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 March 26, 2013 at 09:32 PM 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!
ricardoneves93 Posted March 26, 2013 at 09:38 PM Author Report #500534 Posted March 26, 2013 at 09:38 PM Mesmo, assim está muito mais fácil, não reparei que dava para colocar o que quiséssemos entre os números. Quem sabe sabe 😉 Mais uma vez obrigado http://www.speedtest.net/result/2682095343.png
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now