2009-10-07 4 views
5

나중에 결과를 출력 할 수 있도록 "HH : MM : SS"형식으로 문자 배열 (문자열)에 현재 시간을 가져와야합니다. 단순히 printf("%s", timeString);HH : MM : SS 형식의 문자열 입력 시간 (C 프로그래밍)

와 내가 BTW timevaltime_t 유형에 꽤 혼란, 그래서 어떤 설명이 좋지 않을까 :)

편집 : 그래서 나는의 strftime 등으로 시도하고 좀했다. 여기 내 코드는 다음과 같습니다.

time_t current_time; 
struct tm * time_info; 
char timeString[8]; 

time(&current_time); 
time_info = localtime(&current_time); 

strftime(timeString, 8, "%H:%M:%S", time_info); 
puts(timeString); 

출력은 "13 : 49 : 53a ?? J`s?"입니다.

끝에 "?? J`sS?"이 어떻게 될까요?

답변

8

이 코드에서 쓰레기를 얻고 :

time_t current_time; 
struct tm * time_info; 
char timeString[8]; 

time(&current_time); 
time_info = localtime(&current_time); 

strftime(timeString, 8, "%H:%M:%S", time_info); 
puts(timeString); 

당신이 문자열에 널 (NULL) 종료 (\ 0)을위한 공간을 허용하지 않는 것 때문에, 그래서 문자열은 인쇄 할 때, 그렇지 않습니다 끝이 어디인지 알고 문자열의 일부로 메모리의 다음 비트에서 무작위 쓰레기를 분석합니다. 이것에

변경을 :

time_t current_time; 
struct tm * time_info; 
char timeString[9]; // space for "HH:MM:SS\0" 

time(&current_time); 
time_info = localtime(&current_time); 

strftime(timeString, sizeof(timeString), "%H:%M:%S", time_info); 
puts(timeString); 

그리고 strftime()는 \ 0을 추가 할 수있는 공간이 충분하기 때문에 제대로 작동합니다. 두 곳에서 숫자를 변경하는 것을 잊어 버리는 위험을 피하기 위해 sizeof (array)를 사용하고 있습니다.

+0

아 물론. 고마워 친구! – o01

+1

나는 보통 비관적 인 접근법을 취하고 버퍼 크기를 지나치게 할당한다. 예를 들어'timeString []'을 20 자 정도의 char로 선언 할 수 있습니다. 메모리는 저렴하며 여기서는 몇 가지 추가 바이트에 대해서만 이야기합니다. 나중에 포맷 문자열을 변경하기로 결정했지만 버퍼 길이를 업데이트하는 것을 잊어 버리면 저장됩니다. –

+0

컴파일러가 배열의 크기를 넘기 위해서'sizeof()'를 사용하기 위해 +1. –

4

strftime 함수를 살펴보면 원하는 형식으로 문자 배열에 시간을 쓸 수 있습니다.

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

/* get seconds since the Epoch */ 
time_t secs = time(0); 

/* convert to localtime */ 
struct tm *local = localtime(&secs); 

/* and set the string */ 
sprintf(timeString, "%02d:%02d:%02d", local->tm_hour, local->tm_min, local->tm_sec); 

시간을 다루는 중요한 유형 (시간의 벽 시계 타입이 아닌 프로세스/스레드 시간) time_tstruct tm 있습니다.
일부 작업을 통해 서로간에 변환 할 수 있지만 현지 시간 대 UTC 시간에주의해야합니다.

정독 description of <time.h>, 당신은 다시

C.

에 시간을 grok 수 UTC 시간과 현지 시간으로 관심을 때까지이 기능을 사용해보십시오.

+0

본질적으로 안전하지 않은 sprintf()의 사용을 확산시키지 않아야합니까? –

+0

나는 약간 동의한다. .. 그러나 위의 발췌 문장에서 ... 우리가 본질적으로 안전하지 않은 정수 첨가의 사용을 확산시키지 못하게해야 하는가? – pmg

관련 문제