delphi:常用系统函数(转载)
原文:https://www.cnblogs.com/Little-Star/p/7541389.html
字符串处理函数 Unit System
函数原型 function Concat(s1 [, s2,..., sn]: string): string; 说明 与 S := S1 + S2 + S3 ...; 相同. 将字符串相加.
函数原型 function Copy(S: string; Index, Count: Integer): string;说明 S : 字符串. Indexd : 从第几位开始拷贝. Count : 总共要拷贝几位. 从母字符串拷贝至另一个字符串.
函数原型 procedure Delete(var S: string; Index, Count:Integer);说明 S : 字符串. Indexd : 从第几位开始删. Count : 总共要删几位. 删除字符串中的数个字元.
函数原型 procedure Insert(Source: string; var S: string; Index: Integer);说明 Source : 子字符串. S : 被插入字符串. Indexd : 从第几位开始插入. 将一个子字符串插入另一个字符串中.
函数原型 function Length(S: string): Integer; 求字符数
函数原型 function Pos(Substr: string; S: string): Integer;说明 Substr : 子字符串.S : 母字符串. 寻找子字符串在母字符串中的位置.
函数原型 function LowerCase(const S: string): string; 将字符串全部转为小写字母.
函数原型 function UpperCase(const S: string): string; 将字符串全部转为大写字母.
pos(obj,target) 在target字符串中找出第一个出现obj的第一个字符位置,如果找不到,返回0.
function StringReplace(const S, OldPattern, NewPattern: string; Flags: TReplaceFlags): string;功能 返回替换后的字符串说明 rfReplaceAll为替换全部内容;rfIgnoreCase为忽略大小写
function StringToGUID(const S: string): TGUID;功能 返回字符串S转换成全局标识说明 如果字符串非法将触发异常
function GUIDToString(const GUID: TGUID): string;功能 返回全局标识GUID转换成字符串
函数原型 procedure Str(X [: Width [: Decimals ]]; var S); 将数值转换为格式化的字符串.说明 X : 欲转换的整数 or 实数. Width : 格式化长度.(Integer) Decimals : 小数点位数.(Integer)
函数原型 procedure Val(S; var V; var Code: Integer); 将字符串转为数字.说明 S : 欲转换的字符串. V : 转换后的整数 or 实数.Code : Code = 0 表示转换成功.
函数原型 function NewStr(const S: string): PString; 在 heap 中配置一个新的字符串空间给PString 指针.
函数原型 procedure DisposeStr(P: PString); 在 heap 中释放一个字符串空间 PString指针.
函数原型 function IntToHex(Value: Integer; Digits: Integer): string;
函数原型 function IntToStr(Value: Integer): string;
函数原型 function StrToInt(const S: string): Integer;
函数原型 function StrToIntDef(const S: string; Default: Integer): Integer; 说明 Value : 欲转换的整数. Digits : 欲转换为几位数的 Hex.
函数原型 function Trim(const S: string): string; 将字符串前后的空白及控制字元清掉.
函数原型 function TrimLeft(const S: string): string; 将字符串左边的空白及控制字元清掉.
函数原型 function TrimRight(const S: string): string; 将字符串右边的空白及控制字元清掉.
函数原型 function AdjustLineBreaks(const S: string): string; 将字符串的换行符号全部改为#13#10
函数原型 function StrAlloc(Size: Cardinal): PChar; 配置字符串空间. 说明 Size=字符串最大空间+1
函数原型 function StrBufSize(Str: PChar): Cardinal; 传回由 StrAlloc 配置空间的大小
函数原型 function StrCat(Dest, Source: PChar): PChar; 字符串相加.
函数原型 function StrComp(Str1, Str2 : PChar): Integer; 比较两字符串大小.
函数原型 function StrCopy(Dest, Source: PChar): PChar; 拷贝字符串.
函数原型 procedure StrDispose(Str: PChar); 释放StrAlloc or StrNew所配置的空间.
函数原型 function StrECopy(Dest, Source: PChar): PChar; 拷贝字符串并传回字符串结束位址.
函数原型 function StrEnd(Str: PChar): PChar; 传回字符串结束位址.
函数原型 function StrIComp(Str1, Str2:PChar): Integer; 比较两字符串大小.(不分大小写)
函数原型 function StrLCat(Dest, Source: PChar; MaxLen: Cardinal): PChar;字符串相加.(指定长)
函数原型 function StrLComp(Str1, Str2: PChar; MaxLen: Cardinal):Integer; 比较两字符串大小.(指定长)
函数原型 function StrLCopy(Dest, Source: PChar; MaxLen: Cardinal): PChar; 拷贝字符串.(指定长)
函数原型 function StrLen(Str: PChar): Cardinal; 传回字符串长度.(不含终止位元)
函数原型 function StrLIComp(Str1, Str2: PChar; MaxLen: Cardinals): Integer; 比较两字符串大小.(指定长,不分大小写)
函数原型 function StrLower(Str: PChar): PChar; 将字符串全部转为小写字母.
函数原型 function StrMove(Dest, Source: PChar; Count:Cardinal): PChar; 从来源字符串拷贝n个Bytes到目标r串.(不含终止位元)
函数原型 function StrNew(Str: PChar): PChar; 配置字符串空间.
函数原型 function StrPas(Str: PChar): string; 将 null-terminated 字符串转为Pascal-style 字符串.
函数原型 function StrPCopy(Dest: PChar; Source: string): PChar; 拷贝 Pascal-style 字符串到null-terminated 字符串.
函数原型 function StrPLCopy(Dest: PChar; const Source: string; MaxLen: Cardinal): PChar; 拷贝 Pascal-style 字符串到null-terminated 字符串.(指定长)
函数原型 function StrPos(Str1, Str2: PChar): PChar; 子字符串在母字符串中的位置.(第一个位置) 说明 Str1 母字符串;Str2 子字符串
函数原型 function StrUpper(Str: PChar): PChar; 将字符串全部转为大写字母.
StrAlloc 配置一个最大长度为Size-1 的缓冲区给null 结尾字符串function StrAlloc(Size: Word): PChar;
StrBufSize 传回由StrAlloc 配置的字符串缓冲区内可以储存的最大字元数。StrBufSize( S: PChar ): Cardinal;
StrCat连结两个字符串并传回该字符串。function StrCat(Dest, Source: PCar): PChar;
StrComp 比照两个字符串。function StrComp(Str1, Str2 : Pchar): Integer;
StrCopy 拷贝Source 字符串到Dest 上。function StrCopy(Dest, Source: PChar): PChar
StrDispose 释回一个字符串空间。function StrDispose(Str:PChar);
StrECopy 拷贝Source 字符串到Dest 上并传回指向该字符串结尾的指针。function StrECopy(Dest, Surce: Pchar): Pchar;
StrEnd 传回一指针指向字符串的结尾function StrEnd(Str: Pchar): Pchar;
StrLCat 将Source 字符串连结到Dest 字符串后,并传回连结的字符串。function StrLCat(Dest, Source:PCar; MaxLen: Word): PChar;
StrIComp 比较两个字符串具无大小写区别function StrIComp(Str1, Str2:Pchar): Integer;
StrLComp 比较两个字符串到所指定的最大长度function StrLComp(Str1, Str2:Pchar; MaxLen: Word): Integer;
StrLCopy 从一字符串拷贝指定字元数到另一字符串Function StrLCopy(Dest,Source:PChar;MaxLen: Cardinal): PChar;
StrLen 传回字符串的长度。function StrLen(Str: PChar):Cardinal;
StrLIComp 比较两个字符串到所指定的最大长度具无大小写区别。function StrLIComp(Str1, Str2:PChar; MaxLen: Word):Integer;
StrLower 将字符串转成小写。function StrLower(Str: PChar):PChar;
StrMove 拷贝Count 字元数,从Source 到Dest字符串。function StrMove(Dest, Source:PChar; Count: Cardinal): PChar
StrNew 从堆积配置一个字符串。function StrNew(Str: PChar):PChar;
StrPas 将null 结尾字中转成一个Pascal 格式字符串。function StrPas(Str: Pchar):String;
StrPCopy 拷贝一个Pascal 格式字符串到一个null结尾字符串。Function StrPCopy(Dest:PChar;Source: String): PChar;
StrPLCopy 拷贝MaxLen 所指字元数,从Pascal格式字符串到null 结尾字符串。Function StrPLCopy(Dest:Pchar;cost Source: string;MaxLen: Word): PChar;
StrPos 传回一指针指向在Str1 内最先出现 Str2 字符串的位置。function StrPos(Str1, Str2: Pchar): Pchar;
StrScan 传回一指针指向在Str 字符串中第一个出现chr 字元的位置。function StrScan(Str: PChar; Chr: Char): PChar;
StrRScan 传回一指针指向在Str 子串中最后出现chr 字元的位置。function StrRScan(Str: Pchar; Chr: Char): PChar;
StrUpper 将字符串转成大写。function StrUpper(Str: PChar):PChar;
日期与时间函数 (Date and Time Routines) Unit: SysUtils
Date 传回今天日期。function Date: TDateTime;
DateTimeToStr 将时间格式转为字符串。function DateTimeToStr(DateTime: TDateTime):String;
DateTimeToString 将时间格式转为字符串。procedure DateTimeToString(var Result: string;const Format: string;DateTime: TDateTime);
DateToStr 将日期格式转为字符串。function DateToStr(Date: TDateTime): String;
DayOfWeek 传回今天星期几。function DayOfWeek(Date: TDateTime): Integer; 传回值是一整数,1~7. 星期日为1.
DecodeDate 分解所指定的日期为年、月、日。procedure DecodeDate(Date: TDateTime;var Year, Month, Day:Word);
DecodeTime 分解所指定的日期为时、分、秒。procedure DecodeTime(Time: TDateTime;var Hour, Min, Sec,MSec: Word);
EncodeDate 传回将年、月、日所组合的日期格式。function EncodeDate(Year, Month, Day: Word):TDateTime;
EncodeTime 传回将时、分、秒所组合的时间格式。function EncodeTime(Hour, Min, Sec, MSec:Word): TDateTime;
FormatDateTime 以指定的格式传回日期时间。function FormatDateTime(const Format: string;DateTime: TDateTime):String;
Now 传回现在的日期时间。function Now: TDateTime;
StrToDate 将字符串转为日期格式。function StrToDate(const S:string): TDateTime;
StrToDateTime 将字符串转为日期时间格式function StrToDateTime(const S: string): TDateTime;
StrToTime 将字符串转为时间格式。function StrToTime(const S:string): TDateTime;
Time 传回现在时间。function Time: TDateTime;
TimeToStr 将时格式转为字符串。function TimeToStr(Time:TDateTime): String;
文件管理函数 Unit: SysUtils
函数原型 function ExtractFileDir(const FileName: string): string;
函数原型 function ExtractFileDrive(const FileName: string): string;
函数原型 function ExtractFileExt(const FileName: string): string;
函数原型 function ExtractFileName(const FileName: string): string;
函数原型 function ExtractFilePath(const FileName: string): string;
函数原型 function DeleteFile(const FileName: string): Boolean;
函数原型 function RenameFile(const OldName, NewName: string):Boolean;
函数原型 function FileExists(const FileName: string): Boolean;
函数原型 procedure FindClose(var F: TSearchRec);
函数原型 function FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer;
函数原型 function FindNext(var F: TSearchRec): Integer;说明 成功传回0
ChangeFileExt 变更文件的扩展名。
function ChangeFileExt(const FileName,Extension: string):string; DateTimeToFileDate 将Delphi 的日期格式转换为DOS的日期格式。
functionDateTimeToFileDate(DateTime:TDateTime): Longint;
DeleteFile 删除一个文件。function DeleteFile(const FileName: string):Boolean;
DiskFree 传回磁碟的可用空间。function DiskFree(Drive: Byte): Longint;
DiskSize 传回指定磁碟的容量大小。function DiskSize(Drive: Byte): Longint;
ExpandFileName 传回一个完整的路径及档名字符串。function expandFileName(const FileName: string):string;
ExtractFileExt 传回文件的扩展名。function ExtractFileExt(const FileName string):string;
ExtractFileName 传回文件的档名。function ExtractFileName(const FileName: string):string;
ExtractFilePath 传回文件的路径。function ExtractFilePath(const FileName: string):string;
FileAge 传回文件的年纪function FileAge(const FileName: string):Longint;
FileCreate 以指定档名建立一个文件。function FileCreate(const FileName: string):Integer;
FileClose 关闭指定的文件。procedureFileClose(Handle: Integer);
FileDateToDateTime 将DOS 的日期格式转为Delphi 的日期格式。function FileDateToDateTime(FileDate: Longint):TDateTime;
FileExists 判别文件是否存在。function FileExists(const FileName: string):Boolean;
FileGetAttr 传回文件属性。function FileGetAttr(const FileName: string):Integer;
FileGetDate 传回文件的日期及时间。function FileGetDate(Handle: Integer): Longint;
FileRead 从指定的文件读入资料。function FileRead(Handle:Integer; var Buffer;Count:Longint):Longint;
FileSearch 在目录列中搜寻指定的文件。function FileSearch(constName, DirList: string):string;
FileSeek 改变文件游标的位置。function FileSeek(Handle: Integer;Offset: Longint;Origin: Integer):Longint;
FileSetAttr 设定文件属性。function FileSetAttr(const FileName: string;Attr:Integer): Integer;
FileSetDate 设定文件的日期及时间。procedure FileSetDate(Handle: Integer; Age:Longint);
FileOpen 开启文件。function FileOpen(const FileName: string; Mode:Word): Integer;
FileWrite 写资料到文件。function FileWrite(Handle:Integer;const Buffer; Count:Longint): Longint;
FindClose 终止找寻第一个/下一个的动作。procedure FindClose(var SearchRec: TSearchRec);
FindFirst 寻找第一个符合的文件并设定其属性。
function FindFirst(const Path: string;Attr: Word; var F:TSearchRec): Integer;
FindNext 传回下一个符合的文件。function FindNext(var F:TSearchRec): Integer;
RenameFile 变更文件名。function RenameFile(const OldName,NewName: string):Boolean;
转换函数(Transfer Routines)Unit: System
Chr 传回ASCII 码所对应的字元。function Chr(X: Byte): Char;
High 传回叁数在范围内的最高值。function High(X);
Low 传回叁数在范围内的最低值。function Low(X);
Ord 传回一个有序型态所对应的顺序值。function Ord(X): Longint;
Round 将一个实数值四舍五入而传回整数值。function Round(X: Real):Longint;
Trunc 将一个实数值去尾而传回整数值。function Trunc(X: Real):Longint;
pred(x) pred('D')='C', pred(true)=1;
succ(x) succ('Y')='Z', succ(pred(x))=x
ord(x) 求x在字符集中的序号,如ord('A')=65
chr(x) chr(65)='A'
round(x) 四舍五入
trunc(x) trunc(4.8)=4,trunc('-3.6')=-3
upcase(x) upcase('a')='A'
hi(I) hi($2A30)=$2A
lo(I) lo($2A30)=$30
random(n) 产生[0,n)间的随机整数
sizeof(name) 求出某类型或变量在内存中占用的字节数
swap(num) 交换int的高低位 swap($3621)=$2136
Frac 求一个实数的小数部份
R := Frac(123.456); { 0.456 }
R := Frac(-123.456); { -0.456 }
Int 求一个实数的整数部份
R := Int(123.456); { 123.0 }
R := Int(-123.456); { -123.0 }
函数原型 function High(X); 传回注脚的最大值
函数原型 function Low(X); Low 传回注脚的最小值.
函数原型 function Ord(X): Longint; 传回列举型态的数值.
函数原型 function Round(X: Extended): Longint; 将实数转为整数.(有四舍五入)
函数原型 function Trunc(X: Extended): Longint; 将实数转为整数.(小数直接舍弃)
函数原型 function VarArrayCreate(const Bounds: array of Integer; VarType: Integer): Variant; 建立一个variant array.
函数原型 function VarArrayOf(const Values: array of Variant): Variant; 建立一个简单的一维variant array
函数原型 function VarArrayLock(var A: Variant): Pointer; 将variant阵列==>指定给一阵列变数.
函数原型 procedure VarArrayUnlock(var A: Variant); 解除上述的指定.
函数原型 function VarIsArray(const V: Variant): Boolean; 传回Variant是否为一个阵列.
函数原型 function VarIsNull(const V: Variant): Boolean; 传回Variant是否为NULL.
函数原型 function VarAsType(const V: Variant; VarType: Integer): Variant; 将Variant转为另外一个型态的Variant.
函数原型 procedure VarCast(var Dest: Variant; const Source: Variant; VarType: Integer);说明 VarType不可为varArray or varByRef.
函数原型 function VarType(const V: Variant): Integer; 传回Variant的型态.
函数原型 procedure VarClear(var V: Variant); 将variant清除,成为Unassigned状态.
函数原型 procedure VarCopy(var Dest: Variant; const Source: Variant); 拷贝一个variant.说明 与Dest:=Source;效果一样.
函数原型 function VarFromDateTime(DateTime: TDateTime): Vari ant; 将DateTime转为Variant.
函数原型 function VarToDateTime(const V: Variant): TDateTime; 将Variant转为DateTime.
函数原型 function Hi(X): Byte; 传回高位元数字.Hi($1234); { $12 }
函数原型 procedure Include(var S: set of T; I:T); 说明 加入I元素到S中. 加入一个元素到一组元素.
函数原型 function Lo(X): Byte; Lo($1234); { $34 }
函数原型 procedure Move(var Source, Dest; Count: Integer); 从来源变数拷贝n个Bytes到目的变数.
函数原型 function ParamCount: Integer; 直接由执行档后加上传入变数的个数.
函数原型 function ParamStr(Index: Integer): string;说明 ParamStr(0);传回执行档的名称及完整目录.
函数原型 function Random [ ( Range: Integer) ]; 说明 0<=X<Range
函数原型 function Swap(X); Swap 将一组变数的高低位元交换.
函数原型 function UpCase(Ch: Char): Char; 将一字元转为大写字母.
函数原型 procedure Dec(var X[ ; N: Longint]);说明 Dec(X) ==> X:=X-1; Dec(X,N) ==> X:=X-N; 使变数递减.
函数原型 procedure Inc(var X [ ; N: Longint ] );说明 Inc(X) ==> X:=X-1;Inc(X,N) ==> X:=X-N; 使变数递增.
函数原型 function Odd(X: Longint): Boolean; 检查是否为奇数.
函数原型 function Assigned(var P): Boolean; Assigned 测试指针变数是否为nil. 说明 当@P=nil ==> 传回FALSE
数学函数
Abs 传回叁数的绝对值。 function Abs(X);
ArcTan 传回正切函数的反函数值。 function ArcTan(X: Real): Real;
Cos 传回馀弦函数值 function Cos(X: Real): Real; (X 以弧度为单位)。
Exp 传回自然指数值。 function Cos(X: Real): Real;
Frac 传回叁数的小数部份。 function Frac(X: Real): Real;
Int 传回叁数的整数部份。 function Int(X: Real): Real;
Ln 传回自然对数值。 function Ln(X: Real): Real;
Pi 传回圆周率π的值。 function Pi: Real;
Sin 传回正弦函数值。 function Sin(X: Real): Real;
Sqr 传回叁数的平方。 function Sqr(X: Real): (Real);
Sqrt 传回叁数的平方根。 function Sqrt(X: Real): Real;
输出入函数Unit: System
AssignFile 指定一个文件到文件变数。procedure AssignFile(var f, String);
CloseFile 关闭文件。procedure CloseFile(var F);
Eof 判断是否已到文件结尾。
Typed or untyped files: functionEof(var F): BooleanText files:function Eof [ (var F: Text) ]:Boolean;
Erase 清除文件内容。procedure Erase(var F);
FilePos 传回目前文件游标位置。function FilePos(var F): Longint;
FileSize 传回文件的大小function FileSize(var F):Longint;
GetDir 传回指定磁碟的工作目录。procedure GetDir(D: Byte; var S: String);
IOResult 传回最后I/O 执行的状态。function IOResult: Integer;
MkDir 建立一子目录。procedure MkDir(S: String);
Rename 变更外部文件的档名。procedure Rename(var F; Newname);
Reset 开启一个已存在的文件。procedure Reset(var F [: File; Recsize: Word ] );
Rewrite 建立并开启一个新档。procedure Rewrite(var F: File [; Recsize: Word ] );
RmDir 删除一个空目录。procedure RmDir(S: String);
Seek 移动文件游标。procedure Seek(var F; N: Longint);
Truncate 删截目前位置以后的文件内容。procedure Truncate(var F);
浮点数转换函数 Unit: SysUtils
FloatToDecimal 将浮点数值分成小数及整数部份的数字传回。
procedure FloatToDecimal(var Result: TFloatRec;Value:Extended;Precision, Decimals:Integer);
FloatToStrF 依照指定格式将浮点数转成字符串描述。
function FloatToStrF(Value: Extended; Format:TFloatFormat;Precision,Digits: Integer): string;
FloatToStr 将浮点数转成字符串描述。function FloatToStr(Value: Extended): string;
FloatToText 将所给的浮点数值,分成小数及整数部份的数字依照格式传回。
function FloatToText(Buffer: Pchar; Value:Extended;Format:TFloatFormat;Precision,Digits: Integer): Integer;
FloatToTextFmt 将浮点数依照格式转成字符串传回。
function FloatToTextFmt(Buffer: PChar; Value:Extended;Format: PChar) :Integer;
FormatFloat 将浮点数值依照Format 格式传回。
function FormatFloat(constFormat: string;Value:Extended):string;
StrToFloat 将所给字符串转成一个浮点数值。
function StrToFloat(const S: string): Extended;
TextToFloat 将一个null 结尾字符串转成浮点数值
function TextToFloat(Buffer: PChar;var Value:Extended): Boolean;
流程控制函数 Unit: System
Break 终止循环。如for, while 及repeat 循环。
Continue 继续循环。如for, while 及repeat 循环。
Exit 离开目前的区块。procedure Exit;
Halt 停止程式的执行并回到作业系统。
动态配置函数Unit: System
Dispose 释回一个动态变数。procedure Dispose(var P: Pointer);
Free 释放一个物件复本。procedure Free;
FreeMem 释回一给定大小的动态变数。procedure FreeMem(var P:Pointer; Size: Word);
GetMem 建立一个指定大小的动态变数,并由Pointer 叁数传回位址。procedure GetMem(var P:Pointer; Size: Word);
New 建立一个新的动态变数,并将Pointer 叁数指向它。procedure New(var P: Pointer);function New(<pointer type>):Pointer;
MaxAvail 传回连续最大的可配置空间。function MaxAvail: Longint;
MemAvail 传回所有的可配置空间。function MemAvail: Longint;
指针和位址函数 Unit: System
addr 传回指定物件的位址。function Addr(X): pointer;
Assigned 判断是否一个函数或程序是nil function Assigned(var P):Boolean;
CSeg 传回CS 程式段暂存器的内容。function CSeg: Word;
DSeg 传回DS 资料段暂存器的内容。function DSegt: Word;
Ofs 传回叁数的偏移位址。function Ofs(X): Word;
Ptr 将所指定的节段及偏移位址组合到一个指针。function Ptr(Seg, Ofs: Word):Pointer;
Seg 传回叁数的节段位址。function Seg(X): Word;
SPtr 传回SP 堆叠存器的内容。function SPtr: Word;
SSeg 传回SS 堆叠段暂存器的内容。function SSeg: Word;
控制台函数 Unit: WinCrt
AssignCrt 将文字档连结到一个控制台视窗。 procedure AssignCrt(var f: Text);
ClrEol 清附游标位置到该行最后的所有字元。procedure ClrEol;
ClrScr 清附萤幕并重置游标至左上角。 procedure ClrScr;
CursorTo 移动游标至给定座标。 procedure CursorTo(X, Y:Integer);
DoneWinCrt 结束控制台视窗。 procedure DoneWinCrt;
GotoXY 移动游标至给定座标。 procedure GotoXY(X, Y: Byte);
InitWinCrt 建立控制台视窗。 procedure InitWinCrt;
KeyPressed 判断是否有一按键。 function KeyPressed:Boolean;
ReadBuf 从控制台视窗读入一行。 function ReadBuf(Buffer: Pchar;Count: Word):
ReadKey 读取按键字元。function ReadKey: Char;
ScrollTo 卷动控制台视窗至显示位置。procedure ScrollTo(X, Y: Integer);
TrackCursor 卷动控制台视窗宜到游标可见。procedure TrackCursor;
WhereX 传回游标的X 座标。function WhereX: Byte;
WhereY 传回游标的Y 标标。function WhereY: Byte;
WriteBuf 写入一区块字元到控制台视窗。procedure WriteBuf
WriteChar 写一个字元到控制台视窗。procedure WriteChar(CH: Char);
若是本人原创文章,请标明:本文来自博客园,作者:huiy_小溪,转载请注明原文链接:https://www.cnblogs.com/huiy/p/12938089.html。
反之,请标明原创作者,文章链接,所属平台。