c語言時間到產(chǎn)生信號函數(shù),c語言 獲取時間

C語言中各種函數(shù)的具體作用,要詳細(xì)點(diǎn)的

字符處理函數(shù)

成都創(chuàng)新互聯(lián)公司于2013年開始,先為龍泉驛等服務(wù)建站,龍泉驛等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為龍泉驛企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

本類別函數(shù)用于對單個字符進(jìn)行處理,包括字符的類別測試和字符的大小寫轉(zhuǎn)換

頭文件 ctype.h

函數(shù)列表

函數(shù)類別 函數(shù)用途 詳細(xì)說明

字符測試 是否字母和數(shù)字 isalnum

是否字母 isalpha

是否控制字符 iscntrl

是否數(shù)字 isdigit

是否可顯示字符(除空格外) isgraph

是否可顯示字符(包括空格) isprint

是否既不是空格,又不是字母和數(shù)字的可顯示字符 ispunct

是否空格 isspace

是否大寫字母 isupper

是否16進(jìn)制數(shù)字(0-9,A-F)字符 isxdigit

字符大小寫轉(zhuǎn)換函數(shù) 轉(zhuǎn)換為大寫字母 toupper

轉(zhuǎn)換為小寫字母 tolower

地區(qū)化

本類別的函數(shù)用于處理不同國家的語言差異。

頭文件 local.h

函數(shù)列表

函數(shù)類別 函數(shù)用途 詳細(xì)說明

地區(qū)控制 地區(qū)設(shè)置 setlocale

數(shù)字格式約定查詢 國家的貨幣、日期、時間等的格式轉(zhuǎn)換 localeconv

數(shù)學(xué)函數(shù)

本分類給出了各種數(shù)學(xué)計算函數(shù),必須提醒的是ANSI C標(biāo)準(zhǔn)中的數(shù)據(jù)格式并不符合IEEE754標(biāo)準(zhǔn),一些C語言編譯器卻遵循IEEE754(例如frinklin C51)

頭文件 math.h

函數(shù)列表

函數(shù)類別 函數(shù)用途 詳細(xì)說明

錯誤條件處理 定義域錯誤(函數(shù)的輸入?yún)?shù)值不在規(guī)定的范圍內(nèi))

值域錯誤(函數(shù)的返回值不在規(guī)定的范圍內(nèi))

三角函數(shù) 反余弦 acos

反正弦 asin

反正切 atan

反正切2 atan2

余弦 cos

正弦 sin

正切 tan

雙曲函數(shù) 雙曲余弦 cosh

雙曲正弦 sinh

雙曲正切 tanh

指數(shù)和對數(shù) 指數(shù)函數(shù) exp

指數(shù)分解函數(shù) frexp

乘積指數(shù)函數(shù) fdexp

自然對數(shù) log

以10為底的對數(shù) log10

浮點(diǎn)數(shù)分解函數(shù) modf

冪函數(shù) 冪函數(shù) pow

平方根函數(shù) sqrt

整數(shù)截斷,絕對值和求余數(shù)函數(shù) 求下限接近整數(shù) ceil

絕對值 fabs

求上限接近整數(shù) floor

求余數(shù) fmod

本分類函數(shù)用于實現(xiàn)在不同底函數(shù)之間直接跳轉(zhuǎn)代碼。 頭文件 setjmp.h io.h

函數(shù)列表

函數(shù)類別 函數(shù)用途 詳細(xì)說明

保存調(diào)用環(huán)境 setjmp

恢復(fù)調(diào)用環(huán)境 longjmp

信號處理

該分類函數(shù)用于處理那些在程序執(zhí)行過程中發(fā)生例外的情況。

頭文件 signal.h

函數(shù)列表

函數(shù)類別 函數(shù)用途 詳細(xì)說明

指定信號處理函數(shù) signal

發(fā)送信號 raise

可變參數(shù)處理

本類函數(shù)用于實現(xiàn)諸如printf,scanf等參數(shù)數(shù)量可變底函數(shù)。

頭文件 stdarg.h

函數(shù)列表

函數(shù)類別 函數(shù)用途 詳細(xì)說明

可變參數(shù)訪問宏 可變參數(shù)開始宏 va_start

可變參數(shù)結(jié)束宏 va_end

可變參數(shù)訪問宏 訪問下一個可變參數(shù)宏 va_arg

輸入輸出函數(shù)

該分類用于處理包括文件、控制臺等各種輸入輸出設(shè)備,各種函數(shù)以“流”的方式實現(xiàn)

頭文件 stdio.h

函數(shù)列表

函數(shù)類別 函數(shù)用途 詳細(xì)說明

文件操作

刪除文件 remove

修改文件名稱 rename

生成臨時文件名稱 tmpfile

得到臨時文件路徑 tmpnam

文件訪問 關(guān)閉文件 fclose

刷新緩沖區(qū) fflush

打開文件 fopen

將已存在的流指針和新文件連接 freopen

設(shè)置磁盤緩沖區(qū) setbuf

設(shè)置磁盤緩沖區(qū) setvbuf

格式化輸入與輸出函數(shù) 格式輸出 fprintf

格式輸入 fscanf

格式輸出(控制臺) printf

格式輸入(控制臺) scanf

格式輸出到緩沖區(qū) sprintf

從緩沖區(qū)中按格式輸入 sscanf

格式化輸出 vfprintf

格式化輸出 vprintf

格式化輸出 vsprintf

字符輸入輸出函數(shù) 輸入一個字符 fgetc

字符串輸入 fgets

字符輸出 fputc

字符串輸出 fputs

字符輸入(控制臺) getc

字符輸入(控制臺) getchar

字符串輸入(控制臺) gets

字符輸出(控制臺) putc

字符輸出(控制臺) putchar

字符串輸出(控制臺) puts

字符輸出到流的頭部 ungetc

直接輸入輸出 直接流讀操作 fread

直接流寫操作 fwrite

文件定位函數(shù) 得到文件位置 fgetpos

文件位置移動 fseek

文件位置設(shè)置 fsetpos

得到文件位置 ftell

文件位置復(fù)零位 remind

錯誤處理函數(shù) 錯誤清除 clearerr

文件結(jié)尾判斷 feof

文件錯誤檢測 ferror

得到錯誤提示字符串 perror

實用工具函數(shù)

本分類給出了一些函數(shù)無法按以上分類,但又是編程所必須要的。

頭文件 stdlib.h

函數(shù)列表

函數(shù)類別 函數(shù)用途 詳細(xì)說明

字符串轉(zhuǎn)換函數(shù) 字符串轉(zhuǎn)換為整數(shù) atoi

字符串轉(zhuǎn)換為長整數(shù) atol

字符串轉(zhuǎn)換為浮點(diǎn)數(shù) strtod

字符串轉(zhuǎn)換為長整數(shù) strtol

字符串轉(zhuǎn)換為無符號長整型 strtoul

偽隨機(jī)序列產(chǎn)生函數(shù) 產(chǎn)生隨機(jī)數(shù) rand

設(shè)置隨機(jī)函數(shù)的起動數(shù)值 srand

存儲管理函數(shù) 分配存儲器 calloc

釋放存儲器 free

存儲器分配 malloc

重新分配存儲器 realloc

環(huán)境通信 中止程序 abort

退出程序執(zhí)行,并清除環(huán)境變量 atexit

退出程序執(zhí)行 exit

讀取環(huán)境參數(shù) getenv

程序掛起,臨時執(zhí)行一個其他程序 system

搜索和排序工具 二分查找(數(shù)據(jù)必須已排序) bsearch

快速排序 qsort

整數(shù)運(yùn)算函數(shù) 求絕對值 abs

div

得到除法運(yùn)算底商和余數(shù)

求長整形底絕對值 labs

求長整形除法的商和余數(shù) ldiv

多字節(jié)字符函數(shù) 得到多字節(jié)字符的字節(jié)數(shù) mblen

得到多字節(jié)字符的字節(jié)數(shù) mbtowc

多字節(jié)字符轉(zhuǎn)換 wctomb

多字節(jié)字符的字符串操作 將多字節(jié)串轉(zhuǎn)換為整數(shù)數(shù)組 mbstowcs

將多字節(jié)串轉(zhuǎn)換為字符數(shù)組 mcstowbs

字符串處理

本分類的函數(shù)用于對字符串進(jìn)行合并、比較等操作

頭文件 string.h

函數(shù)列表

函數(shù)類別 函數(shù)用途 詳細(xì)說明

字符串拷貝 塊拷貝(目的和源存儲區(qū)不可重疊) memcpy

塊拷貝(目的和源存儲區(qū)可重疊) memmove

串拷貝 strcpy

按長度的串拷貝 strncpy

字符串連接函數(shù) 串連接 strcat

按長度連接字符串 strncat

串比較函數(shù) 塊比較 memcmp

字符串比較 strcmp

字符串比較(用于非英文字符) strcoll

按長度對字符串比較 strncmp

字符串轉(zhuǎn)換 strxfrm

字符與字符串查找 字符查找 memchr

字符查找 strchr

字符串查找 strcspn

字符串查找 strpbrk

字符串查找 strspn

字符串查找 strstr

字符串分解 strtok

雜類函數(shù) 字符串設(shè)置 memset

錯誤字符串映射 strerror

求字符串長度 strlen

日期和時間函數(shù)

本類別給出時間和日期處理函數(shù)

頭文件 time.h

函數(shù)列表

函數(shù)類別 函數(shù)用途 詳細(xì)說明

時間操作函數(shù) 得到處理器時間 clock

得到時間差 difftime

設(shè)置時間 mktime

得到時間 time

時間轉(zhuǎn)換函數(shù) 得到以ASCII碼表示的時間 asctime

得到字符串表示的時間 ctime

得到指定格式的時間 strftime

函數(shù)庫未來的發(fā)展方向

本部分用于說明各類別函數(shù)庫在將來如何發(fā)展。

序號 庫類別 頭文件 詳細(xì)說明

1 錯誤處理 errno.h

2 字符處理 ctype.h

3 地區(qū)化 local.h

4 數(shù)學(xué)函數(shù) math.h

5 信號處理 signal.h

6 輸入輸出 stdio.h

7 實用工具程序 stdlib.h

8 字符串處理 string.h

C語言中,用于設(shè)置中斷、中斷信號的函數(shù)有哪些?怎么設(shè)置一個發(fā)送中斷信號(自己定義的)的函數(shù)?

對于C51單片機(jī),其內(nèi)部總共有五級中斷源

分別為外部中斷0、定時器0、外部中斷1、定時器1及串行中斷。

C51單片機(jī)的中斷使用時,主要是通過中斷服務(wù)號來決定的。

如你定義一個中斷服務(wù)函數(shù):

void KEY(void) intterrupt 0

{

}

當(dāng)外部中斷0申請中斷時

會自動根據(jù)interrupt后面的0,找到上面定義的這個中斷服務(wù)函數(shù)。

對于其他四個中斷源,其對應(yīng)的中斷號分別為1、2 、3、4

C語言時間函數(shù)問題

函數(shù)名: time

頭文件:time.h

函數(shù)原型:time_t time(time_t * timer)

功 能: [1]獲取當(dāng)前的系統(tǒng)時間,返回的結(jié)果是一個time_t類型,其實就是一個大整數(shù),其值表示從CUT(Coordinated Universal Time)時間1970年1月1日00:00:00(稱為UNIX系統(tǒng)的Epoch時間)到當(dāng)前時刻的秒數(shù)。然后調(diào)用localtime將time_t所表示的CUT時間轉(zhuǎn)換為本地時間(我們是+8區(qū),比CUT多8個小時)并轉(zhuǎn)成struct tm類型,該類型的各數(shù)據(jù)成員分別表示年月日時分秒。

補(bǔ)充說明: time函數(shù)的原型也可以理解為 long time(long *tloc),即返回一個long型整數(shù)。因為在time.h這個頭文件中time_t實際上就是:

#ifndef _TIME_T_DEFINED

typedef long time_t; /* time value */

#define _TIME_T_DEFINED /* avoid multiple defines of time_t */

#endif

即long。

關(guān)于time_t time(0):time_t被定義為長整型,它返回從1970年1月1日零時零分零秒到目前為止所經(jīng)過的時間,單位為秒。

函數(shù)rand()是真正的隨機(jī)數(shù)生成器,而srand()會設(shè)置供rand()使用的隨機(jī)數(shù)種子。函數(shù)rand()會返回一個處于0和你所指定的數(shù)值(缺 省為1)之間的分?jǐn)?shù)。如果你在第一次調(diào)用rand()之前沒有調(diào)用srand(),那么系統(tǒng)會為你自動調(diào)用srand()。而使用同種子相同的數(shù)調(diào)用 srand()會導(dǎo)致相同的隨機(jī)數(shù)序列被生成。

srand((unsigned)time(NULL))則使用系統(tǒng)定時/計數(shù)器的值做為隨機(jī)種子,所以,在相同的平臺環(huán)境下,顯示的隨機(jī)數(shù)會是偽隨機(jī)數(shù),即每次運(yùn)行顯示的結(jié)果會有不同。

庫函數(shù)中系統(tǒng)提供了兩個函數(shù)用于產(chǎn)生隨機(jī)數(shù):srand()和rand()。

原型為:

函數(shù)一:int rand(void);

從srand (seed)中指定的seed開始,返回一個[seed, RAND_MAX(0x7fff))間的隨機(jī)整數(shù)。

函數(shù)二:void srand(unsigned seed);

參數(shù)seed是rand()的種子,用來初始化rand()的起始值。

但是,要注意的是所謂的“偽隨機(jī)數(shù)”指的并不是假的隨機(jī)數(shù)。其實絕對的隨機(jī)數(shù)只是一種理想狀態(tài)的隨機(jī)數(shù),計算機(jī)只能生成相對的隨機(jī)數(shù)即偽隨機(jī)數(shù)。計算機(jī)生 成的偽隨機(jī)數(shù)既是隨機(jī)的又是有規(guī)律的 —— 一部份遵守一定的規(guī)律,一部份則不遵守任何規(guī)律。比如“世上沒有兩片形狀完全相同的樹葉”,這正點(diǎn)到了事物的特性 —— 規(guī)律性;但是每種樹的葉子都有近似的形狀,這正是事物的共性 —— 規(guī)律性。從這個角度講,我們就可以接受這樣的事實了:計算機(jī)只能產(chǎn)生偽隨機(jī)數(shù)而不是絕對的隨機(jī)數(shù)。

系統(tǒng)在調(diào)用rand()之前都會自動調(diào)用srand(),如果用戶在rand()之前曾調(diào)用過srand()給參數(shù)seed指定了一個值,那么 rand()就會將seed的值作為產(chǎn)生偽隨機(jī)數(shù)的初始值;而如果用戶在rand()前沒有調(diào)用過srand(),那么系統(tǒng)默認(rèn)將1作為偽隨機(jī)數(shù)的初始 值。如果給了一個定值,那么每次rand()產(chǎn)生的隨機(jī)數(shù)序列都是一樣的~~

所以為了避免上述情況的發(fā)生我們通常用srand((unsigned)time(0))或者srand((unsigned)time(NULL))來 產(chǎn)生種子。如果仍然覺得時間間隔太小,可以在(unsigned)time(0)或者(unsigned)time(NULL)后面乘上某個合適的整數(shù)。 例如,srand((unsigned)time(NULL)*10)

關(guān)于求值區(qū)域的問題:要取得[a,b)之間的隨機(jī)整數(shù),使用(rand() % (b-a))+ a (結(jié)果值將含a不含b)。

在a為0的情況下,簡寫為rand() % b。

C語言的時間函數(shù)

C/C++中的日期和時間

摘要:

本文從介紹基礎(chǔ)概念入手,探討了在C/C++中對日期和時間操作所用到的數(shù)據(jù)結(jié)構(gòu)和函數(shù),并對計時、時間的獲取、時間的計算和顯示格式等方面進(jìn)行了闡述。本文還通過大量的實例向你展示了time.h頭文件中聲明的各種函數(shù)和數(shù)據(jù)結(jié)構(gòu)的詳細(xì)使用方法。

關(guān)鍵字:

UTC(世界標(biāo)準(zhǔn)時間),Calendar Time(日歷時間),epoch(時間點(diǎn)),clock tick(時鐘計時單元)

1.概念

在C/C++中,對字符串的操作有很多值得注意的問題,同樣,C/C++對時間的操作也有許多值得大家注意的地方。最近,在技術(shù)群中有很多網(wǎng)友也多次問到過C++語言中對時間的操作、獲取和顯示等等的問題。下面,在這篇文章中,筆者將主要介紹在C/C++中時間和日期的使用方法.

通過學(xué)習(xí)許多C/C++庫,你可以有很多操作、使用時間的方法。但在這之前你需要了解一些“時間”和“日期”的概念,主要有以下幾個:

Coordinated Universal Time(UTC):協(xié)調(diào)世界時,又稱為世界標(biāo)準(zhǔn)時間,也就是大家所熟知的格林威治標(biāo)準(zhǔn)時間(Greenwich Mean Time,GMT)。比如,中國內(nèi)地的時間與UTC的時差為+8,也就是UTC+8。美國是UTC-5。

Calendar Time:日歷時間,是用“從一個標(biāo)準(zhǔn)時間點(diǎn)到此時的時間經(jīng)過的秒數(shù)”來表示的時間。這個標(biāo)準(zhǔn)時間點(diǎn)對不同的編譯器來說會有所不同,但對一個編譯系統(tǒng)來說,這個標(biāo)準(zhǔn)時間點(diǎn)是不變的,該編譯系統(tǒng)中的時間對應(yīng)的日歷時間都通過該標(biāo)準(zhǔn)時間點(diǎn)來衡量,所以可以說日歷時間是“相對時間”,但是無論你在哪一個時區(qū),在同一時刻對同一個標(biāo)準(zhǔn)時間點(diǎn)來說,日歷時間都是一樣的。

epoch:時間點(diǎn)。時間點(diǎn)在標(biāo)準(zhǔn)C/C++中是一個整數(shù),它用此時的時間和標(biāo)準(zhǔn)時間點(diǎn)相差的秒數(shù)(即日歷時間)來表示。

clock tick:時鐘計時單元(而不把它叫做時鐘滴答次數(shù)),一個時鐘計時單元的時間長短是由CPU控制的。一個clock tick不是CPU的一個時鐘周期,而是C/C++的一個基本計時單位。

我們可以使用ANSI標(biāo)準(zhǔn)庫中的time.h頭文件。這個頭文件中定義的時間和日期所使用的方法,無論是在結(jié)構(gòu)定義,還是命名,都具有明顯的C語言風(fēng)格。下面,我將說明在C/C++中怎樣使用日期的時間功能。

2. 計時

C/C++中的計時函數(shù)是clock(),而與其相關(guān)的數(shù)據(jù)類型是clock_t。在MSDN中,查得對clock函數(shù)定義如下:

clock_t clock( void );

這個函數(shù)返回從“開啟這個程序進(jìn)程”到“程序中調(diào)用clock()函數(shù)”時之間的CPU時鐘計時單元(clock tick)數(shù),在MSDN中稱之為掛鐘時間(wal-clock)。其中clock_t是用來保存時間的數(shù)據(jù)類型,在time.h文件中,我們可以找到對它的定義:

#ifndef _CLOCK_T_DEFINED

typedef long clock_t;

#define _CLOCK_T_DEFINED

#endif

很明顯,clock_t是一個長整形數(shù)。在time.h文件中,還定義了一個常量CLOCKS_PER_SEC,它用來表示一秒鐘會有多少個時鐘計時單元,其定義如下:

#define CLOCKS_PER_SEC ((clock_t)1000)

可以看到每過千分之一秒(1毫秒),調(diào)用clock()函數(shù)返回的值就加1。下面舉個例子,你可以使用公式clock()/CLOCKS_PER_SEC來計算一個進(jìn)程自身的運(yùn)行時間:

void elapsed_time()

{

printf("Elapsed time:%u secs.\n",clock()/CLOCKS_PER_SEC);

}

當(dāng)然,你也可以用clock函數(shù)來計算你的機(jī)器運(yùn)行一個循環(huán)或者處理其它事件到底花了多少時間:

#include “stdio.h”

#include “stdlib.h”

#include “time.h”

int main( void )

{

long i = 10000000L;

clock_t start, finish;

double duration;

/* 測量一個事件持續(xù)的時間*/

printf( "Time to do %ld empty loops is ", i );

start = clock();

while( i-- )

finish = clock();

duration = (double)(finish - start) / CLOCKS_PER_SEC;

printf( "%f seconds\n", duration );

system("pause");

}

在筆者的機(jī)器上,運(yùn)行結(jié)果如下:

Time to do 10000000 empty loops is 0.03000 seconds

上面我們看到時鐘計時單元的長度為1毫秒,那么計時的精度也為1毫秒,那么我們可不可以通過改變CLOCKS_PER_SEC的定義,通過把它定義的大一些,從而使計時精度更高呢?通過嘗試,你會發(fā)現(xiàn)這樣是不行的。在標(biāo)準(zhǔn)C/C++中,最小的計時單位是一毫秒。

3.與日期和時間相關(guān)的數(shù)據(jù)結(jié)構(gòu)

在標(biāo)準(zhǔn)C/C++中,我們可通過tm結(jié)構(gòu)來獲得日期和時間,tm結(jié)構(gòu)在time.h中的定義如下:

#ifndef _TM_DEFINED

struct tm {

int tm_sec; /* 秒 – 取值區(qū)間為[0,59] */

int tm_min; /* 分 - 取值區(qū)間為[0,59] */

int tm_hour; /* 時 - 取值區(qū)間為[0,23] */

int tm_mday; /* 一個月中的日期 - 取值區(qū)間為[1,31] */

int tm_mon; /* 月份(從一月開始,0代表一月) - 取值區(qū)間為[0,11] */

int tm_year; /* 年份,其值等于實際年份減去1900 */

int tm_wday; /* 星期 – 取值區(qū)間為[0,6],其中0代表星期天,1代表星期一,以此類推 */

int tm_yday; /* 從每年的1月1日開始的天數(shù) – 取值區(qū)間為[0,365],其中0代表1月1日,1代表1月2日,以此類推 */

int tm_isdst; /* 夏令時標(biāo)識符,實行夏令時的時候,tm_isdst為正。不實行夏令時的進(jìn)候,tm_isdst為0;不了解情況時,tm_isdst()為負(fù)。*/

};

#define _TM_DEFINED

#endif

ANSI C標(biāo)準(zhǔn)稱使用tm結(jié)構(gòu)的這種時間表示為分解時間(broken-down time)。而日歷時間(Calendar Time)是通過time_t數(shù)據(jù)類型來表示的,用time_t表示的時間(日歷時間)是從一個時間點(diǎn)(例如:1970年1月1日0時0分0秒)到此時的秒數(shù)。在time.h中,我們也可以看到time_t是一個長整型數(shù):

#ifndef _TIME_T_DEFINED

typedef long time_t; /* 時間值 */

#define _TIME_T_DEFINED /* 避免重復(fù)定義 time_t */

#endif

大家可能會產(chǎn)生疑問:既然time_t實際上是長整型,到未來的某一天,從一個時間點(diǎn)(一般是1970年1月1日0時0分0秒)到那時的秒數(shù)(即日歷時間)超出了長整形所能表示的數(shù)的范圍怎么辦?對time_t數(shù)據(jù)類型的值來說,它所表示的時間不能晚于2038年1月18日19時14分07秒。為了能夠表示更久遠(yuǎn)的時間,一些編譯器廠商引入了64位甚至更長的整形數(shù)來保存日歷時間。比如微軟在Visual C++中采用了__time64_t數(shù)據(jù)類型來保存日歷時間,并通過_time64()函數(shù)來獲得日歷時間(而不是通過使用32位字的time()函數(shù)),這樣就可以通過該數(shù)據(jù)類型保存3001年1月1日0時0分0秒(不包括該時間點(diǎn))之前的時間。

在time.h頭文件中,我們還可以看到一些函數(shù),它們都是以time_t為參數(shù)類型或返回值類型的函數(shù):

double difftime(time_t time1, time_t time0);

time_t mktime(struct tm * timeptr);

time_t time(time_t * timer);

char * asctime(const struct tm * timeptr);

char * ctime(const time_t *timer);

此外,time.h還提供了兩種不同的函數(shù)將日歷時間(一個用time_t表示的整數(shù))轉(zhuǎn)換為我們平時看到的把年月日時分秒分開顯示的時間格式tm:

struct tm * gmtime(const time_t *timer);

struct tm * localtime(const time_t * timer);

通過查閱MSDN,我們可以知道Microsoft C/C++ 7.0中時間點(diǎn)的值(time_t對象的值)是從1899年12月31日0時0分0秒到該時間點(diǎn)所經(jīng)過的秒數(shù),而其它各種版本的Microsoft C/C++和所有不同版本的Visual C++都是計算的從1970年1月1日0時0分0秒到該時間點(diǎn)所經(jīng)過的秒數(shù)。

4.與日期和時間相關(guān)的函數(shù)及應(yīng)用

在本節(jié),我將向大家展示怎樣利用time.h中聲明的函數(shù)對時間進(jìn)行操作。這些操作包括取當(dāng)前時間、計算時間間隔、以不同的形式顯示時間等內(nèi)容。

4.1 獲得日歷時間

我們可以通過time()函數(shù)來獲得日歷時間(Calendar Time),其原型為:time_t time(time_t * timer);

如果你已經(jīng)聲明了參數(shù)timer,你可以從參數(shù)timer返回現(xiàn)在的日歷時間,同時也可以通過返回值返回現(xiàn)在的日歷時間,即從一個時間點(diǎn)(例如:1970年1月1日0時0分0秒)到現(xiàn)在此時的秒數(shù)。如果參數(shù)為空(NUL),函數(shù)將只通過返回值返回現(xiàn)在的日歷時間,比如下面這個例子用來顯示當(dāng)前的日歷時間:

#include "time.h"

#include "stdio.h"

int main(void)

{

struct tm *ptr;

time_t lt;

lt =time(NUL);

printf("The Calendar Time now is %d\n",lt);

return 0;

}

運(yùn)行的結(jié)果與當(dāng)時的時間有關(guān),我當(dāng)時運(yùn)行的結(jié)果是:

The Calendar Time now is 1122707619

其中1122707619就是我運(yùn)行程序時的日歷時間。即從1970年1月1日0時0分0秒到此時的秒數(shù)。

4.2 獲得日期和時間

這里說的日期和時間就是我們平時所說的年、月、日、時、分、秒等信息。從第2節(jié)我們已經(jīng)知道這些信息都保存在一個名為tm的結(jié)構(gòu)體中,那么如何將一個日歷時間保存為一個tm結(jié)構(gòu)的對象呢?

其中可以使用的函數(shù)是gmtime()和localtime(),這兩個函數(shù)的原型為:

struct tm * gmtime(const time_t *timer);

struct tm * localtime(const time_t * timer);

其中g(shù)mtime()函數(shù)是將日歷時間轉(zhuǎn)化為世界標(biāo)準(zhǔn)時間(即格林尼治時間),并返回一個tm結(jié)構(gòu)體來保存這個時間,而localtime()函數(shù)是將日歷時間轉(zhuǎn)化為本地時間。比如現(xiàn)在用gmtime()函數(shù)獲得的世界標(biāo)準(zhǔn)時間是2005年7月30日7點(diǎn)18分20秒,那么我用localtime()函數(shù)在中國地區(qū)獲得的本地時間會比世界標(biāo)準(zhǔn)時間晚8個小時,即2005年7月30日15點(diǎn)18分20秒。下面是個例子:

#include "time.h"

#include "stdio.h"

int main(void)

{

struct tm *local;

time_t t;

t=time(NUL);

local=localtime(t);

printf("Local hour is: %d\n",local-tm_hour);

local=gmtime(t);

printf("UTC hour is: %d\n",local-tm_hour);

return 0;

}

運(yùn)行結(jié)果是:

Local hour is: 15

UTC hour is: 7

4.3 固定的時間格式

我們可以通過asctime()函數(shù)和ctime()函數(shù)將時間以固定的格式顯示出來,兩者的返回值都是char*型的字符串。返回的時間格式為:

星期幾 月份 日期 時:分:秒 年\n\0

例如:Wed Jan 02 02:03:55 1980\n\0

其中\(zhòng)n是一個換行符,\0是一個空字符,表示字符串結(jié)束。下面是兩個函數(shù)的原型:

char * asctime(const struct tm * timeptr);

char * ctime(const time_t *timer);

其中asctime()函數(shù)是通過tm結(jié)構(gòu)來生成具有固定格式的保存時間信息的字符串,而ctime()是通過日歷時間來生成時間字符串。這樣的話,asctime()函數(shù)只是把tm結(jié)構(gòu)對象中的各個域填到時間字符串的相應(yīng)位置就行了,而ctime()函數(shù)需要先參照本地的時間設(shè)置,把日歷時間轉(zhuǎn)化為本地時間,然后再生成格式化后的字符串。在下面,如果t是一個非空的time_t變量的話,那么:

printf(ctime(t));

等價于:

struct tm *ptr;

ptr=localtime(t);

printf(asctime(ptr));

那么,下面這個程序的兩條printf語句輸出的結(jié)果就是不同的了(除非你將本地時區(qū)設(shè)為世界標(biāo)準(zhǔn)時間所在的時區(qū)):

#include "time.h"

#include "stdio.h"

int main(void)

{

struct tm *ptr;

time_t lt;

lt =time(NUL);

ptr=gmtime();

printf(asctime(ptr));

printf(ctime());

return 0;

}

運(yùn)行結(jié)果:

Sat Jul 30 08:43:03 2005

Sat Jul 30 16:43:03 2005

4.4 自定義時間格式

我們可以使用strftime()函數(shù)將時間格式化為我們想要的格式。它的原型如下:

size_t strftime(

char *strDest,

size_t maxsize,

const char *format,

const struct tm *timeptr

);

我們可以根據(jù)format指向字符串中格式命令把timeptr中保存的時間信息放在strDest指向的字符串中,最多向strDest中存放maxsize個字符。該函數(shù)返回向strDest指向的字符串中放置的字符數(shù)。

函數(shù)strftime()的操作有些類似于sprintf():識別以百分號(%)開始的格式命令集合,格式化輸出結(jié)果放在一個字符串中。格式化命令說明串strDest中各種日期和時間信息的確切表示方法。格式串中的其他字符原樣放進(jìn)串中。格式命令列在下面,它們是區(qū)分大小寫的。

%a 星期幾的簡寫

%A 星期幾的全稱

%b 月分的簡寫

%B 月份的全稱

%c 標(biāo)準(zhǔn)的日期的時間串

%C 年份的后兩位數(shù)字

%d 十進(jìn)制表示的每月的第幾天

%D 月/天/年

%e 在兩字符域中,十進(jìn)制表示的每月的第幾天

%F 年-月-日

%g 年份的后兩位數(shù)字,使用基于周的年

%G 年分,使用基于周的年

%h 簡寫的月份名

%H 24小時制的小時

%I 12小時制的小時

%j 十進(jìn)制表示的每年的第幾天

%m 十進(jìn)制表示的月份

%M 十時制表示的分鐘數(shù)

%n 新行符

%p 本地的AM或PM的等價顯示

%r 12小時的時間

%R 顯示小時和分鐘:hh:mm

%S 十進(jìn)制的秒數(shù)

%t 水平制表符

%T 顯示時分秒:hh:mm:ss

%u 每周的第幾天,星期一為第一天 (值從0到6,星期一為0)

%U 第年的第幾周,把星期日做為第一天(值從0到53)

%V 每年的第幾周,使用基于周的年

%w 十進(jìn)制表示的星期幾(值從0到6,星期天為0)

%W 每年的第幾周,把星期一做為第一天(值從0到53)

%x 標(biāo)準(zhǔn)的日期串

%X 標(biāo)準(zhǔn)的時間串

%y 不帶世紀(jì)的十進(jìn)制年份(值從0到99)

%Y 帶世紀(jì)部分的十進(jìn)制年份

%z,%Z 時區(qū)名稱,如果不能得到時區(qū)名稱則返回空字符。

%% 百分號

如果想顯示現(xiàn)在是幾點(diǎn)了,并以12小時制顯示,就象下面這段程序:

#include “time.h”

#include “stdio.h”

int main(void)

{

struct tm *ptr;

time_t lt;

char str[80];

lt=time(NUL);

ptr=localtime();

strftime(str,100,"It is now %I %p",ptr);

printf(str);

return 0;

}

其運(yùn)行結(jié)果為:

It is now 4PM

而下面的程序則顯示當(dāng)前的完整日期:

#include stdio.h

#include time.h

void main( void )

{

struct tm *newtime;

char tmpbuf[128];

time_t lt1;

time( 1 );

newtime=localtime(1);

strftime( tmpbuf, 128, "Today is %A, day %d of %B in the year %Y.\n", newtime);

printf(tmpbuf);

}

運(yùn)行結(jié)果:

Today is Saturday, day 30 of July in the year 2005.

4.5 計算持續(xù)時間的長度

有時候在實際應(yīng)用中要計算一個事件持續(xù)的時間長度,比如計算打字速度。在第1節(jié)計時部分中,我已經(jīng)用clock函數(shù)舉了一個例子。Clock()函數(shù)可以精確到毫秒級。同時,我們也可以使用difftime()函數(shù),但它只能精確到秒。該函數(shù)的定義如下:

double difftime(time_t time1, time_t time0);

雖然該函數(shù)返回的以秒計算的時間間隔是double類型的,但這并不說明該時間具有同double一樣的精確度,這是由它的參數(shù)覺得的(time_t是以秒為單位計算的)。比如下面一段程序:

#include "time.h"

#include "stdio.h"

#include "stdlib.h"

int main(void)

{

time_t start,end;

start = time(NUL);

system("pause");

end = time(NUL);

printf("The pause used %f seconds.\n",difftime(end,start));//-

system("pause");

return 0;

}

運(yùn)行結(jié)果為:

請按任意鍵繼續(xù). . .

The pause used 2.000000 seconds.

請按任意鍵繼續(xù). . .

可以想像,暫停的時間并不那么巧是整整2秒鐘。其實,你將上面程序的帶有“//-”注釋的一行用下面的一行代碼替換:

printf("The pause used %f seconds.\n",end-start);

其運(yùn)行結(jié)果是一樣的。

4.6 分解時間轉(zhuǎn)化為日歷時間

這里說的分解時間就是以年、月、日、時、分、秒等分量保存的時間結(jié)構(gòu),在C/C++中是tm結(jié)構(gòu)。我們可以使用mktime()函數(shù)將用tm結(jié)構(gòu)表示的時間轉(zhuǎn)化為日歷時間。其函數(shù)原型如下:

time_t mktime(struct tm * timeptr);

其返回值就是轉(zhuǎn)化后的日歷時間。這樣我們就可以先制定一個分解時間,然后對這個時間進(jìn)行操作了,下面的例子可以計算出1997年7月1日是星期幾:

#include "time.h"

#include "stdio.h"

#include "stdlib.h"

int main(void)

{

struct tm t;

time_t t_of_day;

t.tm_year=1997-1900;

t.tm_mon=6;

t.tm_mday=1;

t.tm_hour=0;

t.tm_min=0;

t.tm_sec=1;

t.tm_isdst=0;

t_of_day=mktime(t);

printf(ctime(t_of_day));

return 0;

}

運(yùn)行結(jié)果:

Tue Jul 01 00:00:01 1997

現(xiàn)在注意了,有了mktime()函數(shù),是不是我們可以操作現(xiàn)在之前的任何時間呢?你可以通過這種辦法算出1945年8月15號是星期幾嗎?答案是否定的。因為這個時間在1970年1月1日之前,所以在大多數(shù)編譯器中,這樣的程序雖然可以編譯通過,但運(yùn)行時會異常終止。

5.總結(jié)

本文介紹了標(biāo)準(zhǔn)C/C++中的有關(guān)日期和時間的概念,并通過各種實例講述了這些函數(shù)和數(shù)據(jù)結(jié)構(gòu)的使用方法。筆者認(rèn)為,和時間相關(guān)的一些概念是相當(dāng)重要的,理解這些概念是理解各種時間格式的轉(zhuǎn)換的基礎(chǔ),更是應(yīng)用這些函數(shù)和數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)。

c語言 時間函數(shù)

c語言時間函數(shù):

1、獲得日歷時間函數(shù):

可以通過time()函數(shù)來獲得日歷時間(Calendar Time),其原型為:time_t time(time_t * timer);

如果已經(jīng)聲明了參數(shù)timer,可以從參數(shù)timer返回現(xiàn)在的日歷時間,同時也可以通過返回值返回現(xiàn)在的日歷時間,即從一個時間點(diǎn)(例如:1970年1月1日0時0分0秒)到現(xiàn)在此時的秒數(shù)。如果參數(shù)為空(NUL),函數(shù)將只通過返回值返回現(xiàn)在的日歷時間,比如下面這個例子用來顯示當(dāng)前的日歷時間:

2、獲得日期和時間函數(shù):

這里說的日期和時間就是平時所說的年、月、日、時、分、秒等信息。從第2節(jié)我們已經(jīng)知道這些信息都保存在一個名為tm的結(jié)構(gòu)體中,那么如何將一個日歷時間保存為一個tm結(jié)構(gòu)的對象呢?

其中可以使用的函數(shù)是gmtime()和localtime(),這兩個函數(shù)的原型為:

struct tm * gmtime(const time_t *timer);

struct tm * localtime(const time_t * timer);

其中g(shù)mtime()函數(shù)是將日歷時間轉(zhuǎn)化為世界標(biāo)準(zhǔn)時間(即格林尼治時間),并返回一個tm結(jié)構(gòu)體來保存這個時間,而localtime()函數(shù)是將日歷時間轉(zhuǎn)化為本地時間。比如現(xiàn)在用gmtime()函數(shù)獲得的世界標(biāo)準(zhǔn)時間是2005年7月30日7點(diǎn)18分20秒,那么用localtime()函數(shù)在中國地區(qū)獲得的本地時間會比世界標(biāo)準(zhǔn)時間晚8個小時,即2005年7月30日15點(diǎn)18分20秒。

C語言如何定時觸發(fā)函數(shù)?要求精確的時刻,比如說12點(diǎn)

可能不是你最想要的,但是可以大致滿足你的要求。

另外還可以借助DOS的at命令進(jìn)行計劃任務(wù)。

#include stdio.h

#include conio.h

#include time.h

#include dos.h

main()

{

int HourWant=22;

int MinWant=31;

/*22點(diǎn)31分輸出信息*/

struct time t;

while(1)

{

gettime(t);

if (t.ti_hour==HourWant t.ti_min==MinWant)

{

printf("time is up.");

break;

}

sleep(1); /*Delay for 1 second*/

}

getch();

}

當(dāng)前題目:c語言時間到產(chǎn)生信號函數(shù),c語言 獲取時間
URL標(biāo)題:http://muchs.cn/article8/hchoip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、網(wǎng)站維護(hù)、Google、外貿(mào)建站全網(wǎng)營銷推廣、營銷型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)