已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
CString的构造函数CString( );例:CString csStr;CString( const CString& stringSrc );例:CString csStr(ABCDEF中文123456);CString csStr2(csStr);CString( TCHAR ch, int nRepeat = 1 );例:CString csStr(a,5);/csStr=aaaaaCString( LPCTSTR lpch, int nLength );例:CString csStr(abcdef,3);/csStr=abcCString( LPCWSTR lpsz );例:wchar_t s=Labcdef;CString csStr(s);/csStr=LabcdefCString( const unsigned char* psz );例:const unsigned char s=abcdef;const unsigned char* sp=s;CString csStr(sp);/csStr=abcdefCString( LPCSTR lpsz );例:CString csStr(abcdef);/csStr=abcdefint GetLength( ) const;返回字符串的长度,不包含结尾的空字符。例:csStr=ABCDEF中文123456;printf(%d,csStr.GetLength(); /16void MakeReverse( );颠倒字符串的顺序例:csStr=ABCDEF中文123456;csStr.MakeReverse();coutcsStr;/654321文中FEDCBAvoid MakeUpper( );将小写字母转换为大写字母例:csStr=abcdef中文123456;csStr.MakeUpper();coutcsStr;/ABCDEF中文123456void MakeLower( );将大写字母转换为小写字母例:csStr=ABCDEF中文123456;csStr.MakeLower();coutcsStr;/abcdef中文123456int Compare( LPCTSTR lpsz ) const;区分大小写比较两个字符串,相等时返回0,大于时返回1,小于时返回-1例:csStr=abcdef中文123456;csStr2=ABCDEF中文123456;coutcsStr.CompareNoCase(csStr2); /0int CompareNoCase( LPCTSTR lpsz ) const;不区分大小写比较两个字符串,相等时返回0,大于时返回1,小于时返回-1例:csStr=abcdef中文123456;csStr2=ABCDEF中文123456;coutcsStr.CompareNoCase(csStr2); /-1int Delete( int nIndex, int nCount = 1 )删除字符,删除从下标nIndex开始的nCount个字符例:csStr=ABCDEF;csStr.Delete(2,3);coutcsStr;/ ABF/当nIndex过大,超出对像所在内存区域时,函数没有任何操作。/当nIndex为负数时,从第一个字符开始删除。/当nCount过大,导致删除字符超出对像所在内存区域时,会发生无法预料的结果。/当nCount为负数时,函数没有任何操作。int Insert( int nIndex, TCHAR ch )int Insert( int nIndex, LPCTSTR pstr )在下标为nIndex的位置,插入字符或字符串。返回插入后对象的长度例:csStr=abc;csStr.Insert(2,x);coutcsStr; /abxccsStr=abc;csStr.Insert(2,xyz);coutcsStr; /abxyzc/当nIndex为负数时,插入在对象开头/当nIndex超出对象末尾时,插入在对象末尾int Remove( TCHAR ch );移除对象内的指定字符。返回移除的数目例:csStr=aabbaacc;csStr.Remove(a);coutcsStr; /bbccint Replace( TCHAR chOld, TCHAR chNew );int Replace( LPCTSTR lpszOld, LPCTSTR lpszNew );替换字串例:csStr=abcdef;csStr.Replace(a,x);coutcsStr;/xbcdefcsStr=abcdef;csStr.Replace(abc,xyz);coutcsStr;/xyzdefvoid TrimLeft( );void TrimLeft( TCHAR chTarget );void TrimLeft( LPCTSTR lpszTargets );从左删除字符,被删的字符与chTarget或lpszTargets匹配,一直删到第一个不匹配的字符为止例:csStr=aaabaacdef;csStr.TrimLeft(a);coutcsStr;/baacdefcsStr=aaabaacdef;csStr.TrimLeft(ab);coutcsStr;/cdef/无参数时删除空格void TrimRight( );void TrimRight( TCHAR chTarget );void TrimRight( LPCTSTR lpszTargets );从右删除字符,被删的字符与chTarget或lpszTargets匹配,一直删到第一个不匹配的字符为止例:csStr=abcdeaafaaa;csStr.TrimRight(a);coutcsStr; /abcdeaafcsStr=abcdeaafaaa;csStr.TrimRight(fa);coutcsStr;/abcde/无参数时删除空格void Empty( );清空例:csStr=abcdef;csStr.Empty();printf(%d,csStr.GetLength();/0BOOL IsEmpty( ) const;测试对象是否为空,为空时返回零,不为空时返回非零例:csStr=abc;coutcsStr.IsEmpty(); /0;csStr.Empty();coutcsStr.IsEmpty(); /1;int Find( TCHAR ch ) const;int Find( LPCTSTR lpszSub ) const;int Find( TCHAR ch, int nStart ) const;int Find( LPCTSTR pstr, int nStart ) const;查找字串,nStart为开始查找的位置。未找到匹配时返回-1,否则返回字串的开始位置例:csStr=abcdef;coutcsStr.Find(b); /1coutcsStr.Find(de);/3coutcsStr.Find(b,3); /-1coutcsStr.Find(b,0); /1coutcsStr.Find(de,4);/-1coutcsStr.Find(de,0);/3/当nStart超出对象末尾时,返回-1。/当nStart为负数时,返回-1。int FindOneOf( LPCTSTR lpszCharSet ) const;查找lpszCharSet中任意一个字符在CString对象中的匹配位置。未找到时返回-1,否则返回字串的开始位置例:csStr=abcdef;coutcsStr.FindOneOf(cxy); /2CString SpanExcluding( LPCTSTR lpszCharSet ) const;返回对象中与lpszCharSet中任意匹配的第一个字符之前的子串例:csStr=abcdef;coutcsStr.SpanExcluding(cf);/abCString SpanIncluding( LPCTSTR lpszCharSet ) const;从对象中查找与lpszCharSe中任意字符不匹配的字符,并返回第一个不匹配字符之前的字串例:csStr=abcdef;coutcsStr.SpanIncluding(fdcba);/abcdint ReverseFind( TCHAR ch ) const;从后向前查找第一个匹配,找到时返回下标。没找到时返回-1例:csStr=abba;coutcsStr.ReverseFind(a);/3void Format( LPCTSTR lpszFormat, . );void Format( UINT nFormatID, . );格式化对象,与C语言的sprintf函数用法相同例:csStr.Format(%d,13);coutcsStr; /13TCHAR GetAt( int nIndex ) const;返回下标为nIndex的字符,与字符串的用法相同例:csStr=abcdef;coutcsStr.GetAt(2); /c/当nIndex为负数或超出对象末尾时,会发生无法预料的结果。void SetAt( int nIndex, TCHAR ch );给下标为nIndex的字符重新赋值例:csStr=abcdef;csStr.SetAt(2,x);coutcsStr;/abxdef/当nIndex为负数或超出对象末尾时,会发生无法预料的结果。CString Left( int nCount ) const;从左取字串例:csStr=abcdef;coutcsStr.Left(3); /abc/当nCount等于0时,返回空。/当nCount为负数时,返回空。/当nCount大于对象长度时,返回值与对象相同。CString Right( int nCount ) const;从右取字串例:csStr=abcdef;coutcsStr.Right(3); /def/当nCount等于0时,返回空。/当nCount为负数时,返回空。/当nCount大于对象长度时,返回值与对象相同。CString Mid( int nFirst ) const;CString Mid( int nFirst, int nCount ) const;从中间开始取字串例:csStr=abcdef;coutcsStr.Mid(2); /cdefcsStr=abcdef;coutcsStr.Mid(2,3); /cde/当nFirst为0和为负数时,从第一个字符开始取。/当nFirst等于对象末尾时,返回空字串。/当nFirst超出对象末尾时,会发生无法预料的结果。/当nCount超出对象末尾时,返回从nFirst开始一直到对象末尾的字串/当nCount为0和为负数时,返回空字串。LPTSTR GetBuffer( int nMinBufLength );申请新的空间,并返回指针例:csStr=abcde;LPTSTR pStr=csStr.GetBuffer(10);strcpy(pStr,12345);csStr.ReleaseBuffer();pStr=NULL;coutcsStr /12345/使用完GetBuffer后,必须使用ReleaseBuffer以更新对象内部数据,否则会发生无法预料的结果。void ReleaseBuffer( int nNewLength = -1 );使用GetBuffer后,必须使用ReleaseBuffer以更新对象内部数据例:csStr=abc;LPTSTR pStr=csStr.GetBuffer(10);strcpy(pStr,12345);coutcsStr.GetLength(); /3(错误的用法)csStr.ReleaseBuffer();coutcsStr.GetLength(); /5(正确)pStr=NULL;/CString对象的任何方法都应在ReleaseBuffer之后调用LPTSTR GetBufferSetLength( int nNewLength );申请新的空间,并返回指针例:csStr=abc;csStr.GetBufferSetLength(20);coutcsStr;/abccountcsStr.GetLength(); /20;csStr.ReleaseBuffer();countcsStr.GetLength(); /3;/使用GetBufferSetLength后可以不必使用ReleaseBufferisdigitisdigit原型:extern int isdigit(char c);用法:#include 功能:判断字符c是否为数字说明:当c为数字0-9时,返回非零值,否则返回零。附加说明 此为宏定义,非真正函数。举例:/ isdigit.c#include #include main()int c;clrscr(); / clear screenc=a;printf(%c:%sn,c,isdigit(c)?yes:no);c=9;printf(%c:%sn,c,isdigit(c)?yes:no);c=*;printf(%c:%sn,c,isdigit(c)?yes:no);getchar();return 0;ASSERT使用断言assert()宏是用于保证满足某个特定条件,用法是:assert(表达式);如果表达式的值为假,整个程序将退出,并输出一条错误信息。如果表达式的值为真则继续执行后面的语句。使用这个宏前需要包含头文件assert.h例如#include #include void main() float a,b; scan(%f %f,&a,&b); assert(b!=0); printf(%fn,a/b);以上的程序要计算A/B的值,因此要求b!=0,所以在程序中使用了assert()用于确保b!=0,如果b=0,则程序会退出。VC中数字与字符串转换方法VC中数字与字符串转换方法字符串转数字1CRT函数ASCIIUNICODETCHARVS2005intatoi_wtoi_tstoi_ttoi_atoi_l_wtoi_llongatol_wtol_tstoi_ttoi_atoi_l_wtoi_l_int64_atoi64_wtoi64_tstoi64_ttoi64_atoi64_l_wtoi64_lfloat_atoflt_atoflt_ldoubleatof_wtof_tstof_ttof_atof_l_wtof_l_atodbl_atodbl_llong double_atoldbl_atoldbl_l2.使用sscanf3.Windows SDK:StrToInt4.MFC/ATL:CString:Format数字转字符串1.CRT函数ASCIIUNICODETCHARVS2005intitoa_itoa_itow_itotlongltoa_ltoa_ltow_ltot_int64_i64toa_i64tow_i64totdoublegcvt_gcvt_ecvt_fcvt_wtof_tstof_ttof_gcvt_s_ecvt_s_fcvt_s2.使用sprintf3.:StringCbPrintf通用相互转换方法1.C+流方式:stringstream2.boost库:boost: lexical_cast摘自MSDN:Data-Conversion RoutinesRoutineUseatof, _atof_l, _wtof, _wtof_lConvert string tofloatatoi, _atoi_l, _wtoi, _wtoi_lConvert string toint_atoi64, _atoi64_l, _wtoi64, _wtoi64_lConvert string to_int64atol, _atol_l, _wtol, _wtol_lConvert string tolong_ecvt,_ecvt_sConvertdoubleto string of specified length_fcvt,_fcvt_sConvertdoubleto string with specified number of digits following decimal point_gcvt,_gcvt_sConvertdoublenumber to string; store string in buffer_itoa, _i64toa, _ui64toa, _itow, _i64tow, _ui64tow,_itoa_s, _i64toa_s, _ui64toa_s, _itow_s, _i64tow_s, _ui64tow_sConvertintor_int64to string_ltoa, _ltow,_ltoa_s, _ltow_sConvertlongto stringstrtod, _strtod_l, wcstod, _wcstod_lConvert string todoublestrtol, wcstol, _strtol_l, _wcstol_lConvert string tolongintegerstrtoul, _strtoul_l, wcstoul, _wcstoul_lConvert string tounsigned longinteger_ultoa, _ultow,_ultoa_s, _ultow_sConvertunsignedlongto stringatof, _atof_l, _wtof, _wtof_lConvert wide-character string to adoubleatoi, _atoi_l, _wtoi, _wtoi_lConvert wide-character string toint_atoi64, _atoi64_l, _wtoi64, _wtoi64_lConvert wide-character string to_int64atol, _atol_l, _wtol, _wtol_lConvert wide-character string tolongCString:MidCString:Mid说明:此成员函数从此CString对象中提取一个长度为nCount个字符的子串,从nFirst(从零开始的索引)指定的位置开始。此函数返回一个对所提取的字符串的拷贝。Mid类似于Basic MID$函数(除了索引是从零开始的)。CString Mid( int nFirst ) const;throw( CMemoryException );CString Mid( int nFirst, int nCount ) const;throw( CMemoryException );返回值:返回一个包含指定范围字符的拷贝的CString对象。注意,这个返回的CString对象可能是空的。参数:nFirst 此CString对象中的要被提取的子串的第一个字符的从零开始的索引。nCount 要从此CString对象中提取的字符数。如果没有提供这个参数,则字符串的其余部分都被提取。对于多字节字符集(MBCS),nCount指的是每8位字符的数目;也就是说,在一个多字节字符中开始和结尾字节被算作两个字符。示例:下面的例子说明了如果如何使用CString:Mid。/ CString:Mid示例:CString s( _T(abcdef) );ASSERT( s.Mid( 2, 3 ) = _T(cde) );以下为MSDN说明:CString:MidThis method extracts a substring of lengthnCountcharacters from thisCStringobject, starting at positionnFirst(zero-based). The method returns a copy of the extracted substring.Midis similar to the Basic MID$ function, except that indexes are zero-based.CString Mid(intnFirst,intnCount)const;CString Mid(intnFirst)const;ParametersnFirstSpecifies the zero-based index of the first character in this CString object that is to be included in the extracted substring.nCountSpecifies the number of characters to extract from this CString object. If this parameter is not supplied, the remainder of the string is extracted.Return Value ACStringobject that contains a copy of the specified range of characters. Note that the returnedCStringobject may be empty.Example The following example demonstrates the use ofCString:Mid./ example for CString:MidCString s( _T(abcdef) );ASSERT( s.Mid( 2, 3 ) = _T(cde) );CString:Find 编辑本段作用在一个较大的字符串中查找字符或子字符串 int Find( TCHAR ch ) const; int Find( LPCTSTR lpszSub ) const; int Find( TCHAR ch, int nStart ) const; int Find( LPCTSTR pstr, int nStart ) const; 编辑本段返回值返回此CString对象中与需要的子字符串或字符匹配的第一个字符的从零开始的索引;如果没有找到子字符串或字符则返回-1。 编辑本段参数ch 要搜索的单个字符。 lpszSub 要搜索的子字符串。 nStart 字符串中开始搜索的字符的索引,如果是0,则是从头开始搜索。如果nStart不是0,则位于nStart之前的字符不包括在搜索之内。 pstr 指向要搜索的字符串的指针 编辑本段说明此成员函数用来在此字符串中搜索子字符串的第一个匹配的字符。函数的重载可以接收单个字符(类似于运行时函数strchr)和字符串(类似于strstr)。 编辑本段示例/下面演示第一个例子 / CString:Find( TCHAR ch ) CString s( abcdef ); int n = s.Find( c ); / 结果 n = 2 int f = s.Find( de ) ; / 结果 f = 3 ASSERT( n = 2 ); ASSERT( f = 3 ); / 下面演示第二个例子 / CString:Find(TCHAR ch,int nStart) CString str(The stars are aligned); int n = str.Find(e,2); /结果 n = 2CString的GetBuffer用法,GetBuffer本质,GetBuffer常见问题解决方法 一函数原型CString:GetBuffer LPTSTR GetBuffer( int nMinBufLength );throw( CMemoryException );Return ValueAn LPTSTR pointer to the objects (null-terminated) character buffer.ParametersnMinBufLengthThe minimum size of the character buffer in characters. This value does not include space for a null terminator.RemarksReturns a pointer to the internal character buffer for the CString object. The returned LPTSTR is not const and thus allows direct modification of CString contents.If you use the pointer returned by GetBuffer to change the string contents, you must call ReleaseBuffer before using any other CString member functions. 二函数作用及使用范围对一个CString变量,你可以使用的唯一合法转换符是LPCTSTR,直接转换成非常量指针(LPTSTR-const char*)是错误的。正确的得到一个指向缓冲区的非常量指针的方法是调用GetBuffer()方法。GetBuffer()主要作用是将字符串的缓冲区长度锁定,releaseBuffer则是解除锁定,使得CString对象在以后的代码中继续可以实现长度自适应增长的功能。CString :GetBuffer有两个重载版本:LPTSTR GetBuffer( );LPTSTR GetBuffer(int nMinBufferLength);在第二个版本中,当设定的长度小于原字符串长度时,nMinBufLength = nOldLen,该参数会被忽略,不分配内存,指向原CString;当设定的长度大于原字符串本身的长度时就要重新分配(reallocate)一块比较大的空间出来。而调用第一个版本时,应如通过传入0来调用第二个版本一样。是否需要在GetBufer后面调用ReleaseBuffer(),是根据你的后面的程序是否需要继续使用该字符串变量,并且是否动态改变其长度而定的。如果你GetBuffer以后程序自函数就退出,局部变量都不存在了,调用不调用ReleaseBuffer没什么意义了。最典型的应用就是读取文件:CFile file;/ FILE_NAME 为实现定义好的文件名称if(file.Open(FILE_NAME,CFile:modeRead) CString szContent; int nFileLength = file.GetLength(); file.Read(szContent.GetBuffer(nFileLength),nFileLength); szContent.ReleaseBuffer(); / 取得文件內容放在szContent中,我们之后可以对其操作三测试以下就CString:GetBuffer,做简单测试:测试1:/ example for CString:GetBuffer#include #include void main(void) CString s( abcd ); printf(1)before GetBuffer:n); printf(CString s.length=%dn,s.GetLength(); printf(CString s=%sn,s); LPTSTR p = s.GetBuffer( 2 ); printf(2)after GetBuffer and before ReleaseBuffer:n); printf(LPTSTR p=%sn,p); printf(p.length=%dn,strlen(p);printf(CString s=%sn,s); printf(CString s.length=%dn,s.GetLength(); s.ReleaseBuffer( ); printf(3)after ReleaseBuffer:n); printf(LPTSTR p=%sn,p); printf(p.length=%dn,strlen(p);printf(CString s=%sn,s); printf(CString s.length=%dn,s.GetLength(); 测试结果1:(1)before GetBuffer:CString s.length=4CString s=abcd(2)after GetBuffer and before ReleaseBuffer:LPTSTR p=abcdp.length=4CString s=abcdCString s.length=4(3)after ReleaseBuffer:LPTSTR p=abcdp.length=4CString s=abcdCString s.length=4Press any key to continue测试2:将LPTSTR p = s.GetBuffer( 2 ); 修改为:LPTSTR p = s.GetBuffer( 10 );测试结果同1。测试3:在测试二的LPTSTR p = s.GetBuffer( 10 );后添加 p5=f;测试结果同1。测试4:将测试三的p5=f;修改为p4=e;测试结果4:(1)before GetBuffer:CString s.length=4CString s=abcd(2)after GetBuffer and before ReleaseBuffer:LPTSTR p=abcde屯屯?p.length=10CString s=abcde屯屯?CString s.length=4(3)after ReleaseBuffer:LPTSTR p=abcde屯屯?p.length=10CString s=abcde屯屯?CString s.length=10Press any key to continue很显然(2)after GetBuffer and before ReleaseBuffer:中 CString s.length=4结果有问题。注意:以上测试是在_MBCS环境下,如果换成_UNICODE则结果有可能不同。参考:CString GetBuffer()/hbyh/archive/2007/09/15/1786574.aspxCString之GetBuffer问题/thread-379834-1-1.htmlCString的GetBuffer/blog/article.asp?id=40755CString GetBuffer() and ReleaseBuffer()/guanchanghui/archive/2006/09/13/1217096.aspxCString:GetBuffer()与CString:ReleaseBuffer到底有什么用?/t/20060313/22/4612156.htmlmemset求助编辑百科名片将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向S的指针。目录需要的头文件函数原型程序例memset函数详细说明展开需要的头文件函数原型程序例memset函数详细说明展开编辑本段需要的头文件在C中 在C+中编辑本段函数原型函数介绍void *memset(void *s,int ch,size_tn);函数解释:将s中前n个字节用ch替换并返回s;memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法1。常见错误第一: 搞反了ch 和 n的位置.一定要记住 如果要把一个char a20清零,一定是 memset(a,0,20)而不是 memset(a,20,0)第二: 过度使用memset,我想这些程序员可能有某种心理阴影,他们惧怕未经初始化的内存,所以他们会写出这样的代码:char buffer20;memset(buffer,0,sizeof(char)*20);strcpy(buffer,123);这里的memset是多余的. 因为这块内存马上就被覆盖了,清零没有意义.第三: 其实这个错误严格来讲不能算用错memset,但是它经常在使用memset的场合出现int some_func(struct something *a)memset(a,0,sizeof(a);这里错误的原因是VC函数传参过程中的指针降级,导致sizeof(a),返回的是一个 something* 指针类型大小的的字节数,如果是32位,就是4字节。常见问题问:为何要用memset置零?memset(&Address,0,sizeof(Address);经常看到这样的用法,其实不用的话,分配数据的时候,剩余的空间也会置零的。答:1.如果不清空,可能会在测试当中出现野值。你做下面的试验看看结果()char buf5;CString str,str1;/memset(buf,0,sizeof(buf);for(int i = 0;i5;i+)str.Format(“%d “,bufi);str1 +=str ;TRACE(“%sr n“,str1);其实不然!特别是对于字符指针类型的,剩余的部分通常是不会为0的,不妨作一个试验,定义一个字符数组,并输入一串字符,如果不用memset实现清零,使用MessageBox显示出来就会有乱码(0表示NULL,如果有,就默认字符结束,不会输出后面的乱码)问:如下demo是可以的,能把数组中的元素值都设置成字符1,#include #include using namespace std;int main()char a5;memset(a,1,5);for(int i = 0;i 5;i+)coutai ;system(pause);return 0;而,如下程序想把数组中的元素值设置成1,却是不可行的#include #include using namespace std;int main()int a5;memset(a,1,5);/如果这里改成memset(a,1,5 *sizeof(int)也不
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 六年级道德与法治下册期中考试卷及答案一
- 人身安全班会课件
- 打印店创业计划书
- 安全小课件幼儿园
- 电子商务开发工程师求职指南面试题与答案解析
- 企业管理-尾矿库未占用矿产资源的申请报告模板
- 客户关系管理心理技巧测试题集
- 恐惧症识别与应对技巧测试及答案
- 廊坊六中高考模拟题与答案解析
- 居家养老护理服务质量评价标准及答案解析
- 2023-2025年中考语文试题分类汇编:散文阅读(一)解析版
- 安全培训申请
- 继电保护培训课件
- 圆通安全知识培训课件
- 技术人员能力提升总结
- 预防医学各章的复习题和参考答案
- 钢板桩工程施工劳务合同(2025版)
- 海员的心理健康维护体系构建
- 变电运维培训课件
- 体育用品供货运输方案及保障措施
- 内河港口船舶充电站技术要求
评论
0/150
提交评论