項目相關-常用函數_第1頁
項目相關-常用函數_第2頁
項目相關-常用函數_第3頁
項目相關-常用函數_第4頁
項目相關-常用函數_第5頁
已閱讀5頁,還剩44頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

常用函數文件描述符概念:所有打開文件都由它引用是一個非負整數。當打開一個現存文件或創建一個文件時,內核向進程返回一個文件描述符。當讀、寫一個文件時,用open或creat返回的文件描述符標識該文件,將其作為參數傳送給read或write1.open(打開文件)頭文件:#include<fcntl.h>定義函數:intopen(constchar*pathname,intflags,mode_tmode);函數說明:參數pathname指向欲打開的文件路徑字符串。下列是參數flags所

能使用的旗標:O_RDONLY以只讀方式打開文件O_WRONLY以只寫方式打開文件O_RDWR以可讀寫方式打開文件。上述三種旗標是互斥的,也

就是不可同時使用,但可與下列的旗標利用OR(|)運算符組合。O_CREAT若欲打開的文件不存在則自動建立該文件。O_EXCL如果O_CREAT也被設置,此指令會去檢查文件是否存

在。文件若不存在則建立該文件,否則將導致打開文件錯誤。此外,

若O_CREAT與O_EXCL同時設置,并且欲打開的文件為符號連接,

則會打開文件失敗。返回值:若所有欲核查的權限都通過了檢查則返回0值,表示成功,只要有

一個權限被禁止則返回-1。2.read(由已打開的文件讀取數據)頭文件:#include<unistd.h>定義函數:ssize_tread(intfd,void*buf,size_tcount);函數說明:read()會把參數fd所指的文件傳送count個字節到buf指針所指

的內存中。若參數count為0,則read()不會有作用并返回0。返

回值為實際讀取到的字節數,如果返回0,表示已到達文件尾或是

無可讀取的數據,此外文件讀寫位置會隨讀取到的字節移動。參數含義:[1]文件描述符[2]分配的用戶存儲空間[3]期望讀多少數據出來返回值:讀到的字節數,若已到文件尾為0,若出錯為-1.附加說明:如果順利read()會返回實際讀到的字節數,最好能將返回值與參

數count作比較,若返回的字節數比要求讀取的字節數少,則有可

能讀到了文件尾、從管道(pipe)或終端機讀取,或者是read()

被信號中斷了讀取動作。當有錯誤發生時則返回-1,錯誤代碼存入errno中,而文件讀寫位置則無法預期。3.write(將數據寫入已打開的文件內)頭文件:#include<unistd.h>定義函數:ssize_twrite(intfd,constvoid*buf,size_tcount);函數說明:write()會把參數buf所指的內存寫入count個字節到參數fd所指

的文件內。當然,文件讀寫位置也會隨之移動。返回值:如果順利write()會返回實際寫入的字節數。當有錯誤發生時則返

回-1,錯誤代碼存入errno中。4.lseek(移動文件的讀寫位置)頭文件:#include<unistd.h>定義函數:off_tlseek(intfildes,off_toffset,intwhence);函數說明:每一個已打開的文件都有一個讀寫位置,當打開文件時通常其讀寫

位置是指向文件開頭,若是以附加的方式打開文件(如O_APPEND),則讀寫

位置會指向文件尾。當read()或write()時,讀寫位置會隨之增加,lseek

()便是用來控制該文件的讀寫位置。參數fildes為已打開的文件描述詞,參數offset為根據參數whence來移動讀寫位置的位移數。參數whence為下列其中一種:SEEK_SET參數offset即為新的讀寫位置。SEEK_CUR以目前的讀寫位置往后增加offset個位移量。SEEK_END將讀寫位置指向文件尾后再增加offset個位移量。

當whence值為SEEK_CUR或SEEK_END時,參數offet允許負值的出現。

下列是教特別的使用方式:1)欲將讀寫位置移到文件開頭時:lseek(intfildes,0,SEEK_SET);2)欲將讀寫位置移到文件尾時:lseek(intfildes,0,SEEK_END);3)想要取得目前文件位置時:lseek(intfildes,0,SEEK_CUR);返回值:若文件

返回值:當調用成功時則返回目前的讀寫位置,也就是距離文件開頭多少個

字節。若有錯誤則返回-1,errno會存放錯誤代碼。5.close(關閉文件)頭文件:#include<unistd.h>定義函數:intclose(intfd);函數說明:當使用完文件后若已不再需要則可使用close()關閉該文件,二close()會讓數據寫回磁盤,并釋放該文件所占用的資源。參數fd

為先前由open()或creat()所返回的文件描述詞。返回值:若文件順利關閉則返回0,發生錯誤時返回-1。附加說明:雖然在進程結束時,系統會自動關閉已打開的文件,但仍建議自行

關閉文件,并確實檢查返回值。6.creat(創建文件)頭文件:#include<fcntl.h>定義函數:intcreat(constchar*pathname,mode_tmode);函數說明:參數pathname指向欲建立的文件路徑字符串。creat()相當于使

用下列的調用方式調用open():open(constchar*pathname,(O_CREAT|O_WRONLY|O_TRUNC));返回值:creat()會返回新的文件描述詞,若有錯誤發生則會返回-1,并把錯誤代碼設給errno。EEXIST參數pathname所指的文件已存在。EACCESS參數pathname所指定的文件不符合所要求測試的權限EROFS欲打開寫入權限的文件存在于只讀文件系統內EFAULT參數pathname指針超出可存取的內存空間EINVAL參數mode不正確。ENAMETOOLONG參數pathname太長。ENOTDIR參數pathname為一目錄ENOMEM核心內存不足ELOOP參數pathname有過多符號連接問題。EMFILE已達到進程可同時打開的文件數上限ENFILE已達到系統可同時打開的文件數上限附加說明:creat()無法建立特別的裝置文件,如果需要請使用mknod()。7.chmod(改變文件的權限)頭文件:#include<sys/types.h>#include<sys/stat.h>定義函數:intchmod(constchar*path,mode_tmode);函數說明:chmod()會依參數mode權限來更改參數path指定文件的權限。

參數mode有下列數種組合:S_ISUID04000文件的(setuser-idonexecution)位S_ISGID02000文件的(setgroup-idonexecution)位S_ISVTX01000文件的sticky位S_IRUSR(S_IREAD)00400文件所有者具可讀取權限S_IWUSR(S_IWRITE)00200文件所有者具可寫入權限S_IXUSR(S_IEXEC)00100文件所有者具可執行權限S_IRGRP00040用戶組具可讀取權限S_IWGRP00020用戶組具可寫入權限S_IXGRP00010用戶組具可執行權限S_IROTH00004其他用戶具可讀取權限S_IWOTH00002其他用戶具可寫入權限S_IXOTH00001其他用戶具可執行權限

只有該文件的所有者或有效用戶識別碼為0,才可以修改該文件權

限。基于系統安全,如果欲將數據寫入一執行文件,而該執行文件

具有S_ISUID或S_ISGID權限,則這兩個位會被清除。如果一目

錄具有S_ISUID位權限,表示在此目錄下只有該文件的所有者或root可以刪除該文件。返回值:權限改變成功返回0,失敗返回-1,錯誤原因存于errno。8.printf(格式化輸出數據)頭文件:#include<stdio.h>定義函數:intprintf(constchar*format,.............);函數說明:printf()會根據參數format字符串來轉換并格式化數據,然后將結

果寫出到標準輸出設備,直到出現字符串結束(’\0’)為止。

參數format字符串可包含下列三種字符類型:1.一般文本,伴隨直接輸出。2.ASCII控制字符,如\t、\n等。3.格式轉換字符。

格式轉換為一個百分比符號(%)及其后的格式字符所組成。一般

而言,每個%符號在其后都必需有一printf()的參數與之相呼應

(只有當%%轉換字符出現時會直接輸出%字符),而欲輸出的數

據類型必須與其相對應的轉換字符類型相同。返回值:成功則返回實際輸出的字符數,失敗則返回-1,錯誤原因存于errno

中。9.malloc(配置內存空間)頭文件:#include<stdlib.h>定義函數:void*malloc(size_tsize);函數說明:malloc()用來配置內存空間,其大小由指定的size決定。返回值:若配置成功則返回一指針,失敗則返回NULL。范例:voidp=malloc(1024);/*配置1k的內存*/10.calloc(配置內存空間)頭文件:#include<stdlib.h>定義函數:void*calloc(size_tnmemb,size_tsize);函數說明:calloc()用來配置nmemb個相鄰的內存單位,每一單位的大小為size,并返回指向第一個元素的指針。這和使用下列的方式效果相

同:malloc(nmemb*size);不過,在利用calloc()配置內存時會將內

存內容初始化為0。返回值:若配置成功則返回一指針,失敗則返回NULL。

11.free(釋放原先配置的內存)頭文件:#include<stdlib.h>定義函數:voidfree(void*ptr);函數說明:參數ptr為指向先前由malloc()、calloc()或realloc()所返回的內存

指針。調用free()后ptr所指的內存空間便會被收回。假若參數ptr

所指的內存空間已被收回或是未知的內存地址,則調用free()可能

會有無法預期的情況發生。若參數ptr為NULL,則free()不會有任

何作用。12.mmap(建立內存映射)頭文件:#include<unistd.h>#include<sys/mman.h>定義函數:void*mmap(void*start,size_tlength,intprot,intflags,intfd,off_toffsize);函數說明:mmap()用來將某個文件內容映射到內存中,對該內存區域的存取即

是直接對該文件內容的讀寫。參數start指向欲對應的內存起始地址,

通常設為NULL,代表讓系統自動選定地址,對應成功后該地址會返回。

參數length代表將文件中多大的部分對應到內存。參數prot代表映射

區域的保護方式,

有下列組合:PROT_EXEC映射區域可被執行PROT_READ映射區域可被讀取PROT_WRITE映射區域可被寫入PROT_NONE映射區域不能存取返回值:若映射成功則返回映射區的內存起始地址,否則返回MAP_FAILED

(-1),錯誤原因存于errno中。

13.munmap(解除內存映射)頭文件:#include<unistd.h>#include<sys/mman.h>定義函數:intmunmap(void*start,size_tlength);函數說明:munmap()用來取消參數start所指的映射內存起始地址,參數length則是欲取消的內存大小。當進程結束或利用exec相關函數來

執行其他程序時,映射內存會自動解除,但關閉對應的文件描述詞時

不會解除映射。返回值:如果解除映射成功則返回0,否則返回-1,錯誤原因存于errno中

14.memset(將一段內存空間填入某值)頭文件:#include<string.h>定義函數:void*memset(void*s,intc,size_tn);函數說明:memset()會將參數s所指的內存區域前n個字節以參數c填入,

然后返回指向s的指針。在編寫程序時,若需要將某一數組作初始

化,memset()會相當方便。返回值:返回指向s的指針。附加說明:參數c雖聲明為int,但必須是unsignedchar,所以范圍在0到255

之間。

范例:#include<string.h>main(){chars[30];memset(s,’A’,sizeof(s));s[30]=’\0’;printf(“%s\n”,s);}執行:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA15.bzero(將一段內存內容全清為零)頭文件:#include<string.h>定義函數:voidbzero(void*s,intn);函數說明:bzero()會將參數s所指的內存區域前n個字節,全部設為零值。

相當于調用memset((void*)s,0,size_tn);返回值:無附加說明:建議使用memset取代16.fflush(更新緩沖區)頭文件:#include<stdio.h>定義函數:intfflush(FILE*stream);函數說明:fflush()會強迫將緩沖區內的數據寫回參數stream指定的文件中。

如果參數stream為NULL,fflush()會將所有打開的文件數據更新。返回值:成功返回0,失敗返回EOF,錯誤代碼存于errno中。17.memcmp(比較內存內容)頭文件:#include<string.h>定義函數:intmemcmp(constvoid*s1,constvoid*s2,size_tn);函數說明:memcmp()用來比較s1和s2所指的內存區間前n個字符。字符

串大小的比較是以ASCII碼表上的順序來決定,次順序亦為字符的

值。memcmp()首先將s1第一個字符值減去s2第一個字符的值,

若差為0則再繼續比較下個字符,若差值不為0則將差值返回。例

如,字符串“Ac”和“ba”比較則會返回字符‘A’(65)和‘b’

(98)的差值(-33)。返回值:若參數s1和s2所指的內存內容都完全相同則返回0值。s1若大于s2則返回大于0的值。s1若小于s2則返回小于0的值。范例:#include<string.h>main(){char*a=”aBcDeF”;char*b=”AbCdEf”;char*c=”aacdef”;char*d=”aBcDeF”;printf(“memcmp(a,b):%d\n”,memcmp((void*)a,(void*)b,6));printf(“memcmp(a,c):%d\n”,memcmp((void*)a,(void*)c,6));printf(“memcmp(a,d):%d\n”,memcmp((void*)a,(void*)d,6));}執行:memcmp(a,b):1/*字符串a>字符串b,返回1*/memcmp(a,c):-1/*字符串a<字符串c,返回-1*/memcmp(a,d):0/*字符串a=字符串d,返回0*/18.memcpy(拷貝內存內容)頭文件:#include<string.h>定義函數:void*memcpy(void*dest,constvoid*src,size_tn);函數說明:memcpy()用來拷貝src所指的內存內容前n個字節到dest所指的1、

內存地址上。與strcpy()不同的是,memcpy()會完整的復制n

個字節,不會因為遇到字符串結束‘\0‘而結束。strcpy只能復制字符串,而memcpy可以復制任意內容,例如字符數組、整型、結構體、類等。返回值:若參數s1

和s2所指的內存內容都完全相同則返回0值。s1若大于s2則返回大于0的值。s1若小于s2則返回小于0的值。返回值:返回指向dest的指針。附加說明:指針src和dest所指的內存區域不可重疊。

19.strcat(連接兩字符串)頭文件:#include<string.h>定義函數:char*strcat(char*dest,constchar*src);函數說明:strcat()會將參數src字符串拷貝到參數dest所指的字符串尾。第

一個參數dest要有足夠的空間來容納要拷貝的字符串。返回值:返回參數dest的字符串起始地址附加說明:指針src和dest所指的內存區域不可重疊。范例:#include<string.h.>main(){chara[30]=”string(1)”;charb[]=”string(2)”;printf(“beforestrcat():%s\n”,a);printf(“afterstrcat():%s\n”,strcat(a,b));}執行:beforestrcat():string(1)afterstrcat():string(1)string(2)20.strcmp(比較字符串)頭文件:#include<string.h>定義函數:intstrcmp(constchar*s1,constchar*s2);函數說明:strcmp()用來比較參數s1和s2字符串。字符串大小的比較是以ASCII碼表上的順序來決定,此順序亦為字符的值。strcmp()首

先將s1第一個字符值減去s2第一個字符值,若差值為0則再繼續

比較下個字符,若差值不為0則將差值返回。例如字符串“Ac”和“ba”比較則會返回字符“A”(65)和‘b’(98)的差值(-33)。返回值:若參數s1和s2字符串相同則返回0。s1若大于s2則返回大于0的

值。s1若小于s2則返回小于0的值。范例:#include<string.h>main(){char*a=”aBcDeF”;char*b=”AbCdEf”;char*c=”aacdef”;char*d=”aBcDeF”;printf(“strcmp(a,b):%d\n”,strcmp(a,b));printf(“strcmp(a,c):%d\n”,strcmp(a,c));printf(“strcmp(a,d):%d\n”,strcmp(a,d));}執行:strcmp(a,b):1strcmp(a,c):-1strcmp(a,d):021.strncpy(拷貝字符串)頭文件:#include<string.h>定義函數:char*strncpy(char*dest,constchar*src,size_tn);函數說明:strncpy()會將參數src字符串拷貝前n個字符至參數dest所指的

地址。返回值:返回參數dest的字符串起始地址。范例:#inclue<string.h>main(){chara[30]=”string(1)”;charb[]=”string(2)”;printf(“beforestrncpy():%s\n”,a);printf(afterstrncpy():%s\n”,strncpy(a,b,6));}執行:beforestrncpy():string(1)afterstrncpy():string(1)22.strcpy(拷貝字符串)頭文件:#include<string.h>定義函數:char*strcpy(char*dest,constchar*src);函數說明:strcpy()會將參數src字符串拷貝至參數dest所指的地址。返回值:返回參數dest的字符串起始地址。附加說明:如果參數dest所指的內存空間不夠大,可能會造成緩沖溢出(bufferOverflow)的錯誤情況,在編寫程序時請特別留意,或者用strncpy

()來取代。范例:#include<string.h>main(){chara[30]=”string(1)”;charb[]=”string(2)”;printf(“beforestrcpy():%s\n”,a);printf(“afterstrcpy():%s\n”,strcpy(a,b));}執行:beforestrcpy():string(1)afterstrcpy():string(2)23.strlen(返回字符串長度)頭文件:#include<string.h>定義函數:size_tstrlen(constchar*s);函數說明:strlen()用來計算指定的字符串s的長度,不包括結束字符“\0”。返回值:返回字符串s的字符數。范例:/*取得字符串str的長度*/#include<string.h>main(){char*str=”12345678”;printf(“strlength=%d\n”,strlen(str));}執行:strlength=824.strncat(連接兩字符串)頭文件:#include<string.h>定義函數:char*strncat(char*dest,constchar*src,size_tn);函數說明:strncat()會將參數src字符串拷貝n個字符到參數dest所指的字

符串尾。第一個參數dest要有足夠的空間來容納要拷貝的字符串。返回值:返回參數dest的字符串起始地址。范例:#include<string.h>main(){chara[30]=”string(1)”;charb[]=”string(2)”;printf(“beforestrnact():%s\n”,a);printf(“afterstrncat():%s\n”,strncat(a,b,6));}執行:beforestrnact():string(1)afterstrncat():string(1)string25.strstr(在一字符串中查找指定的字符串)頭文件:#include<string.h>定義函數:char*strstr(constchar*haystack,constchar*needle);函數說明:strstr()會從字符串haystack中搜尋字符串needle,并將第一次出現的地址返回。返回值:返回指定字符串第一次出現的地址,否則返回0。范例:#include<string.h>main(){char*s=”090123456789”;char*p;p=strstr(s,”901”);printf(“%s\n”,p);}執行:9090

26.strtok(分割字符串)頭文件:#include<string.h>定義函數:char*strtok(char*s,constchar*delim);函數說明:strtok()用來將字符串分割成一個個片段。參數s指向欲分割的字符串,參數delim則為分割字符串,當strtok()在參數s的字符串中發現到參數delim的分割字符時則會將該字符改為\0字符。在第一次調用時,strtok()必需給予參數s字符串,往后的調用則將參數s設置成NULL。每次調用成功則返回下一個分割后的字符串指針。返回值:返回下一個分割后的字符串指針,如果已無從分割則返回NULL。在使用時,一定要給字符串長度,不然運行后會提示段錯誤。最簡單的程序如下:#include<stdio.h>#include<string.h>main(){ chars1[30]="090123456789"; chars2[]="2"; printf("afterstrtok:%s\n",strtok(s1,s2));}06/26/14分割字符終極版(有福利)終極版:可實現在不知道字符長度的情況下多次分割字符并輸出。#include<stdio.h>#include<string.h>main(){ chars1[30]="090123456789"; chars2[]="2"; inti=0; char*p; char*a[50]; //定義一個指針數組來存放strtok函數運行后的返回值。 p=strtok(s1,s2); //第一次分割必須要給strtok的第一個參數賦值 printf("afterstrtok:%s\n",p); //輸出第一次分割的結果 while((a[i]=strtok(NULL,s2))!=NULL) //當返回值不為NULL時,則還可以繼續分割,直到返回NULL,用a[i]數組來存放每次返回的值 {i++;} //i自加直到不符合while語句條件 intj; //定義一個整型數據j來控制輸出的次數 for(j=0;j<i;j++) //j控制輸出 printf("%s\n",a[j]);}27.perror(打印出錯誤原因信息字符串)頭文件:#include<stdio.h>定義函數:voidperror(constchar*s);函數說明:perror()用來將上一個函數發生錯誤的原因輸出到標準錯誤

(stderr)。參數s所指的字符串會先打印出,后面再加上錯誤原因

字符串。此錯誤原因依照全局變量errno的值來決定要輸出的字符

串。返回值:無28.strerror(返回錯誤原因的描述字符串)頭文件:#include<string.h>定義函數:char*strerror(interrnum);函數說明:strerror()用來依參數errnum的錯誤代碼來查詢其錯誤原因的描述

字符串,然后將該字符串指針返回。返回值:返回描述錯誤原因的字符串指針。范例:/*顯示錯誤代碼0至9的錯誤原因描述*/#include<string.h>//strerror函數已經把所有的錯誤都列出來并且已經編好號碼,范圍為0~132,在調用時根據錯誤的代號把錯誤類型輸出。main(){inti;for(i=0;i<10;i++)printf(“%d:%s\n”,i,strerror(i));}//這個程序只是把0到9號對應的錯誤類型打出來,我們在運行時并不知道錯誤的類型,這時候就要用到errno函數,errno相當于一個寄存器,用于存放錯誤類型的返回值,可見chmod等函數。執行:0:Success1:Operationnotpermitted2:Nosuchfileordirectory3:Nosuchprocess4:Interruptedsystemcall5:Input/outputerror6:Nosuchdeviceoraddress7:Argumentlisttoolong8:Execformaterror9:Badfiledescriptor06/26/14正確使用strerror的代碼#include<stdio.h>#include<string.h>#include<errno.h>//調用errno函數時要用到的頭文件main(){ inta; a=chmod("/home/administrator/aa/ne.c",00777);//此處路徑寫了一個不存在的文件。故返回值應該是錯誤的,且應該存在errno中。 if(a<0) {printf("改變文件權限失敗\n");} else {printf("改變文件權限成功\n");} printf("%d:%s\n",errno,strerror(errno));//從errno中讀取錯誤類型并輸出錯誤原因.}29.getpid(取得進程識別碼)頭文件:#include<unistd.h>定義函數:pid_tgetpid(void);函數說明:getpid()用來取得目前進程的進程識別碼,許多程序利用取到的

此值來建立臨時文件,以避免臨時文件相同帶來的問題。返回值:目前進程的進程識別碼范例:#include<unistd.h>main(){printf(“pid=%d\n”,getpid());}執行:pid=3325/*每次執行結果都不一定相同*/30.getppid(取得父進程的進程識別碼)頭文件:#include<unistd.h>定義函數:pid_tgetppid(void);函數說明:getppid()用來取得目前進程的父進程識別碼。返回值:目前進程的父進程識別碼。范例:#include<unistd.h>main(){printf(“Myparent‘pid=%d\n”,getppid());}執行:Myparent‘pid=218331.sleep(讓進程暫停執行一段時間)頭文件:#include<unistd.h>定義函數:unsignedintsleep(unsignedintseconds);函數說明:sleep()會令目前的進程暫停,直到達到參數seconds所指定的時

間,或是被信號所中斷返回值:若進程暫停到參數seconds所指定的時間則返回0,若有信號中斷

則返回剩余秒數。sleep函數放在你想要讓他睡眠的函數的前面,程序是逐條運行的,先運行sleep函數,在運行后面的函數,所以想讓哪個程序暫停一段時間在運行就把sleep函數放到那段程序前面。32.wait(等待子進程中斷或結束)頭文件:#include<sys/types.h>#include<sys/wait.h>定義函數:pid_twait(int*status);函數說明:wait()會暫時停止目前進程的執行,直到有信號來到或子進程結

束。如果在調用wait()時子進程已經結束,則wait()會立即返

回子進程結束狀態值。子進程的結束狀態值會由參數status返回,

而子進程的進程識別碼也會一快返回。如果不在意結束狀態值,則

參數status可以設成NULL。子

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論