C字符串处理函数全.doc_第1页
C字符串处理函数全.doc_第2页
C字符串处理函数全.doc_第3页
C字符串处理函数全.doc_第4页
C字符串处理函数全.doc_第5页
免费预览已结束,剩余13页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

strcpy(chardestination,constcharsource); strcpy:将字符串source拷贝到字符串destination中。 strcpy函数应用举例 原型:strcpy(chardestination,constcharsource); 功能:将字符串source拷贝到字符串destination中 例程: #include #include voidmain(void) charstr110=TsinghuaOK; charstr210=Computer; coutstrcpy(str1,str2)endl; 运行结果是:Computer 第二个字符串将覆盖掉第一个字符串的所有内容! 注意:在定义数组时,字符数组1的字符串长度必须大于或等于字符串2的字符串长度。不能用赋值语句将一个字符串常量或字符数组直接赋给一个字符数组。所有字符串处理函数都包含在头文件string.h中。 strncpy(chardestination,constcharsource,intnumchars); strncpy:将字符串source中前numchars个字符拷贝到字符串destination中。 strncpy函数应用举例 原型:strncpy(chardestination,constcharsource,intnumchars); 功能:将字符串source中前numchars个字符拷贝到字符串destination中 例程: #include #include voidmain(void) charstr110=Tsinghua; charstr210=Computer; coutstrncpy(str1,str2,3)endl; 运行结果:Comnghua 注意:字符串source中前numchars个字符将覆盖掉字符串destination中前numchars个字符! strcat(chartarget,constcharsource); strcat:将字符串source接到字符串target的后面。 strcat函数应用举例 原型:strcat(chartarget,constcharsource); 功能:将字符串source接到字符串target的后面 例程: #include #include voidmain(void) charstr1=Tsinghua; charstr2=Computer; coutstrcpy(str1,str2)endl; 运行结果:TsinghuaComputer 注意:在定义字符数组1的长度时应该考虑字符数组2的长度,因为连接后新字符串的长度为两个字符串长度之和。进行字符串连接后,字符串1的结尾符将自动被去掉,在结尾串末尾保留新字符串后面一个结尾符。 strncat(chartarget,constcharsource,intnumchars); strncat:将字符串source的前numchars个字符接到字符串target的后面。 strncat函数应用举例: 原型:strncat(chartarget,constcharsource,intnumchars); 功能:将字符串source的前numchars个字符接到字符串target的后面 例程: #include #include voidmain(void) charstr1=Tsinghua; charstr2=Computer; coutstrncat(str1,str2,3)endl; 运行结果:TsinghuaCom intstrcmp(constcharfirststring,constcharsecondstring); strcmp:比较两个字符串firststring和secondstring。 strcmp函数应用举例 原型:intstrcmp(constcharfirststring,constcharsecondstring); 功能:比较两个字符串firststring和secondstring 例程: #include #include voidmain(void) charbuf1=aaa; charbuf2=bbb; charbuf3=ccc; intptr; ptr=strcmp(buf2,buf1); if(ptr0) coutBuffer2isgreaterthanbuffer1endl; else coutBuffer2islessthanbuffer10) coutBuffer2isgreaterthanbuffer3endl; else coutBuffer2islessthanbuffer3endl; 运行结果是:Buffer2islessthanbuffer1 Buffer2isgreaterthanbuffer3 strlen(constcharstring); strlen:统计字符串string中字符的个数。 strlen函数应用举例 原型:strlen(constcharstring); 功能:统计字符串string中字符的个数 例程: #include #include voidmain(void) charstr100; coutstr; coutThelengthofthestringis:strlen(str)个endl; 运行结果Thelengthofthestringisx(x为你输入的字符总数字) 注意:strlen函数的功能是计算字符串的实际长度,不包括0在内。另外,strlen函数也可以直接测试字符串常量的长度,如:strlen(Welcome)。void*memset(void*dest,intc,size_tcount); 将dest前面count个字符置为字符c. 返回dest的值. void*memmove(void*dest,constvoid*src,size_tcount); 从src复制count字节的字符到dest.如果src和dest出现重叠,函数会自动处理. 返回dest的值. void*memcpy(void*dest,constvoid*src,size_tcount); 从src复制count字节的字符到dest.与memmove功能一样,只是不能处理src和dest出现重叠. 返回dest的值. void*memchr(constvoid*buf,intc,size_tcount); 在buf前面count字节中查找首次出现字符c的位置.找到了字符c或者已经搜寻了count个字节,查找即停止. 操作成功则返回buf中首次出现c的位置指针,否则返回NULL. void*_memccpy(void*dest,constvoid*src,intc,size_tcount); 从src复制0个或多个字节的字符到dest.当字符c被复制或者count个字符被复制时,复制停止. 如果字符c被复制,函数返回这个字符后面紧挨一个字符位置的指针.否则返回NULL. intmemcmp(constvoid*buf1,constvoid*buf2,size_tcount); 比较buf1和buf2前面count个字节大小. 返回值0,表示buf1大于buf2. intmemicmp(constvoid*buf1,constvoid*buf2,size_tcount); 比较buf1和buf2前面count个字节.与memcmp不同的是,它不区分大小写. 返回值同上. size_tstrlen(constchar*string); 获取字符串长度,字符串结束符NULL不计算在内. 没有返回值指示操作错误. char*strrev(char*string); 将字符串string中的字符顺序颠倒过来.NULL结束符位置不变. 返回调整后的字符串的指针. char*_strupr(char*string); 将string中所有小写字母替换成相应的大写字母,其它字符保持不变. 返回调整后的字符串的指针. char*_strlwr(char*string); 将string中所有大写字母替换成相应的小写字母,其它字符保持不变. 返回调整后的字符串的指针. char*strchr(constchar*string,charc); 查找字符c在字符串string中首次出现的位置,NULL结束符也包含在查找中. 返回一个指针,指向字符c在字符串string中首次出现的位置,如果没有找到,则返回NULL. char*strrchr(constchar*string,intc); 查找字符c在字符串string中最后一次出现的位置,也就是对string进行反序搜索,包含NULL结束符.返回一个指针,指向字符c在字符串string中最后一次出现的位置,如果没有找到,则返回NULL. char*strstr(constchar*string,constchar*strSearch); 在字符串string中查找strSearch子串. 返回子串strSearch在string中首次出现位置的指针.如果没有找到子串strSearch,则返回NULL.如果子串strSearch为空串,函数返回string值. char*strdup(constchar*strSource); 函数运行中会自己调用malloc函数为复制strSource字符串分配存储空间,然后再将strSource复制到分配到的空间中.注意要及时释放这个分配的空间. 返回一个指针,指向为复制字符串分配的空间;如果分配空间失败,则返回NULL值. char*strcat(char*strDestination,constchar*strSource); 将源串strSource添加到目标串strDestination后面,并在得到的新串后面加上NULL结束符.源串strSource的字符会覆盖目标串strDestination后面的结束符NULL.在字符串的复制或添加过程中没有溢出检查,所以要保证目标串空间足够大.不能处理源串与目标串重叠的情况. 函数返回strDestination值. char*strncat(char*strDestination,constchar*strSource,size_tcount); 将源串strSource开始的count个字符添加到目标串strDest后.源串strSource的字符会覆盖目标串strDestination后面的结束符NULL.如果count大于源串长度,则会用源串的长度值替换count值.得到的新串后面会自动加上NULL结束符.与strcat函数一样,本函数不能处理源串与目标串重叠的情况. 函数返回strDestination值. char*strset(char*string,charc); 将string串的所有字符设置为字符c,遇到NULL结束符停止. 函数返回内容调整后的string指针. char*strnset(char*string,intc,size_tcount); 将string串开始count个字符设置为字符c,如果count值大于string串的长度,将用string的长度替换count值. 函数返回内容调整后的string指针. size_tstrspn(constchar*string,constchar*strCharSet); 查找任何一个不包含在strCharSet串中的字符(字符串结束符NULL除外)在string串中首次出现的位置序号.返回一个整数值,指定在string中全部由characters中的字符组成的子串的长度.如果string以一个不包含在strCharSet中的字符开头,函数将返回0值. size_tstrcspn(constchar*string,constchar*strCharSet); 查找strCharSet串中任何一个字符在string串中首次出现的位置序号,包含字符串结束符NULL. 返回一个整数值,指定在string中全部由非characters中的字符组成的子串的长度.如果string以一个包含在strCharSet中的字符开头,函数将返回0值. char*strspnp(constchar*string,constchar*strCharSet); 查找任何一个不包含在strCharSet串中的字符(字符串结束符NULL除外)在string串中首次出现的位置指针. 返回一个指针,指向非strCharSet中的字符在string中首次出现的位置. char*strpbrk(constchar*string,constchar*strCharSet); 查找strCharSet串中任何一个字符在string串中首次出现的位置,不包含字符串结束符NULL. 返回一个指针,指向strCharSet中任一字符在string中首次出现的位置.如果两个字符串参数不含相同字符,则返回NULL值. intstrcmp(constchar*string1,constchar*string2); 比较字符串string1和string2大小. 返回值0,表示string1大于string2. intstricmp(constchar*string1,constchar*string2); 比较字符串string1和string2大小,和strcmp不同,比较的是它们的小写字母版本. 返回值与strcmp相同. intstrcmpi(constchar*string1,constchar*string2); 等价于stricmp函数,只是提供一个向后兼容的版本. intstrncmp(constchar*string1,constchar*string2,size_tcount); 比较字符串string1和string2大小,只比较前面count个字符.比较过程中,任何一个字符串的长度小于count,则count将被较短的字符串的长度取代.此时如果两串前面的字符都相等,则较短的串要小. 返回值0,表示string1的子串大于string2的子串. intstrnicmp(constchar*string1,constchar*string2,size_tcount); 比较字符串string1和string2大小,只比较前面count个字符.与strncmp不同的是,比较的是它们的小写字母版本. 返回值与strncmp相同. char*strtok(char*strToken,constchar*strDelimit); 在strToken串中查找下一个标记,strDelimit字符集则指定了在当前查找调用中可能遇到的分界符. 返回一个指针,指向在strToken中找到的下一个标记.如果找不到标记,就返回NULL值.每次调用都会修改strToken内容,用NULL字符替换遇到的每个分界符.第一节、字符串操作 一、char_traits字符特征类 1)意义:包装特定串元素的通用行为界面,以便容器实现时依据特征信息而执行特定行为 2)定义了通用类型名 typedef_Elemchar_type; typedefintint_type; typedefstreampospos_type; typedefstreamoffoff_type; typedefmbstate_tstate_type; 其中int_type表示字符元素转换到特定编码时的整型表示,pos_type,off_type分别作为字符串索引和字符串元素偏移的类型,类似容器迭中的指针,迭代类型和指针,迭代器的偏移类型。最后的state_type用于存储流状态,如出错,格式控制等等。 3)定义了字符/字符串操作的包装界面,以便通用算法的调用 assign(a,b)定义将b字符赋值给a字符的过程,实现a.operator=的行为 eq(a,b)定义a字符和b字符的相等关系,实现a.operator=的行为 lt(a,b)定义a小于b的关系,实现a.operator的行为 compare(a_ptr,b_ptr,cnt)定义两组字符串的比较,返回int类型,实现类似memcmp的行为 length(ptr)定义取字符串长度,实现类似strlen的行为 copy(a_ptr,b_ptr,cnt)定义两组字符串的复制,实现类似memcpy的行为 move(a_ptr,b_ptr,cnt)定义两组字符串的不重叠复制,实现类似memmove的行为 assign(ptr,cnt,ch)定义了填充字符串的过程,实现类似memset的行为 to_int_type(ch)定义了char_type到int_type整型的转换过程 to_char_type(n)定义了int_type到char_type字符型的转换过程 eq_int_type(a,b)定义两个和当前char_type类型对应的int_type的相等关系 eof()定义字符串结尾符,使用整型表示 not_eof(n)定义非字符串结尾符,若输入结尾符,则返回1,其他输入返回原值,即总是不返回eof() 4)int_type类型应是当前字符类型的整型编码 二、std:string并不是序列容器,没有front()和back()界面用于取出前端和尾端的元素,使用std:string:operator并传递streampos类型取得特定元素,如std:string:size()-1作为索引取得最后一个字符 十一、C风格字符串 1)字符串操作 strcpy(p,p1)复制字符串 strncpy(p,p1,n)复制指定长度字符串 strcat(p,p1)附加字符串 strncat(p,p1,n)附加指定长度字符串 strlen(p)取字符串长度 strcmp(p,p1)比较字符串 strncmp(p,p1,n)比较指定长度字符串 strchr(p,c)在字符串中查找指定字符 strrchr(p,c)在字符串中反向查找 strstr(p,p1)查找字符串 strpbrk(p,p1)以目标字符串的所有字符作为集合,在当前字符串查找该集合的任一元素 strspn(p,p1)以目标字符串的所有字符作为集合,在当前字符串查找不属于该集合的任一元素的偏移 strcspn(p,p1)以目标字符串的所有字符作为集合,在当前字符串查找属于该集合的任一元素的偏移 *具有指定长度的字符串处理函数在已处理的字符串之后填补零结尾符 2)字符串到数值类型的转换 strtod(p,ppend)从字符串p中转换double类型数值,并将后续的字符串指针存储到ppend指向的char*类型存储。 strtol(p,ppend,base)从字符串p中转换long类型整型数值,base显式设置转换的整型进制,设置为0以根据特定格式判断所用进制,0x,0X前缀以解释为十六进制格式整型,0前缀以解释为八进制格式整型 atoi(p)字符串转换到int整型 atof(p)字符串转换到double符点数 atol(p)字符串转换到long整型 3)文本转换成long类型超出表示范围时将设置C运行时的errno全局变量,errno=ERANGE,使用strerror(errno)来取得错误对应的字符串4)字符检查 isalpha()检查是否为字母字符 isupper()检查是否为大写字母字符 islower()检查是否为小写字母字符 isdigit()检查是否为数字 isxdigit()检查是否为十六进制数字表示的有效字符 isspace()检查是否为空格类型字符 iscntrl()检查是否为控制字符 ispunct()检查是否为标点符号 isalnum()检查是否为字母和数字 isprint()检查是否是可打印字符 isgraph()检查是否是图形字符,等效于isalnum()|ispunct() 第二节、输入输出流 一、输出流 二、各种类型流输出operator重载 输出流不仅接受可显示的数据类型,同时接受操纵符影响输出流的行为并返回输出流的引用,以便使用operator串接一组的操作。 以下列出一些特定的输出类型及其用法和实现概要。 1)为单个字符的输出直接调用put()而不必使用operator 2)为操纵符重载operator std:hex是输出流的操纵符之一,被实现为接受基本流类型引用,并更改其状态为输出十六进制的函数: inlineios_base&_cdeclhex(ios_base&_Iosbase) /setbasefieldtohex _Iosbase.setf(ios_base:hex,ios_base:basefield); return(_Iosbase); 输出流的一个重载版本将代为访问该操纵符: _Myt&operator(ios_base&(_cdecl*_Pfn)(ios_base&) /callios_basemanipulator (*_Pfn)(*(ios_base*)this); return(*this); 最后,当前输出流对象的引用被返回,以串接其他operator操作,通过操纵符的应用,将可以得到类似以下的访问形式: std:coutstd:setw(10)std:internalstd:hexstd:uppercasestd:showbasestd:setfill(0)int(768*1024)std:endl; 3)std:boolalpha操纵符指示输出流使用符号形式表示真假 4)对于指针类型,输出十六进制以表示地址格式,并且即使使用std:showbase以指示输出流输出进制的前缀及其他试图影响指针类型数据的输出格式的操纵符,该指针的地址格式不会发生变化 int*p=std:auto_ptr(newint).get(); std:coutp按空白类型即isspace()对应的字符类型:blank,verticaltable,horizontaltable,return,newline,newpage等分割输入流。当然,对于具有格式要求的输入类型,则在未匹配处中止。 1)std:cinintval; int类型读入非预期的数据,设置ios_base:failbit到流状态。std:cin.rdstate()&std:ios_base:failbit以获取该状态。 2)std:cin.width(n); 显式指示字符串读入的数据长度,以防止目标存储的溢出,包括为目标存储自动添加的0,若传递给std:string等标准库字符串类型则不包含尾端的0空字符,传递到其他类型不受该宽度的限制,且仅影响下一次的输入操作。 四、流状态 1)意义:调用者通过对状态的访问,以了解流的操作结果和存在的异常 good()测试goodbit eof()测试eofbit fail()测试badbit|failbit bad()测试badbit rdstate()取得流状态 clear(flag)清除/设置流状态 setstate(flag)附加流状态 2)异常的流导致下次读取将失效 五、测试流对象的布尔值 booloperator!()否定式。 operatorvoid*()作条件式判断,编译器强制转型到void*,此时可以返回0以表示false。 六、非格式化输入 int_typeget()从输入流取出int_type类型数据,对应单个特定类型编码字符 get取出字符类型数据 get(p,n)取得n长度的字符串到p,按换行符分割 get(p,n,delim)取出n长度的字符串到p,指定分割符 ignore(n,delim)忽略n长度的字符串,指定分割符 read(p,n)读入n个字符 gcount()获得最后一次非格式化输入的取出字符长度 get(p,n,delim)并不取出delim本身,这和getline是不同的,用户在需要的情况下必须手动附加到目标串。另外,连续出现的分隔符将导致取出空字串,ios_base:failbit被附加到流状态,这将导致对get()的条件判断失败。 七、流异常 ios_base:exceptions()获取异常掩码 ios_base:exceptions(iostate)设置异常掩码 ios_base:failure流的异常类 附加到异常掩码的状态位将使得流遭遇特定状态时抛出ios_base:failure异常。 八、流联结 basic_ios:tie()取出和输入流联结的输出流指针 basic_ios:tie(basic_ostream&)设置和输入流联结的输出流指针 *和输入流联结的输出流总是在输入流请求输入前刷新输出流状态,使用basic_ostream:flush(),在文件流中表现为立即写入到磁盘文件。 九、sentry 1)意义:sentry是输入输出流对象的一组自动对象,使用其构造函数和析构函数,负责在流操作中执行预处理和后处理,例如,为流缓冲区附加线程锁 2)sentry对象类型执行条件判断时,隐式转换到bool类型,指针类型则转换到void*类型。重载sentry:operatorbool(),以便从sentry返回流的可用状态,以便指导流的实际动作,如线程冲突可能导致流不可用,sentry必须提供该类信息 第三节、输出流格式 一、ios_base格式设置 flags()读标志位flags(fmt)设置标志位 setf(fmt)附加标志位 setf(fmt,mask)根据掩码附加标志位 unsetf(mask)清除掩码位置的标志 *setf(fmt)和setf(fmt,mask)有一个重要的区别,对于位于同一个掩码值以下的所有位,在具有掩码输入的情况下将被事先清除,这将保证在该掩码值以下的标志位的设定具有互斥的特性,而setf(fmt)将可能在同一个掩码值下的所有位出现多个置位的选项。 二、控制输出流格式位的操纵符 用于控制输出流格式的操纵符大部分位于文件以下。它们可以被附加到basic_ostream:operatorstd:noskipws; std:cin.exceptions(cin.failbit); std:cinintval; 若对以上例程输入包含起始处空格的字符串,则抛出异常,空白字符不是有效的数值格式字符。 四、浮点输出 ios_base:precision()获取浮点数精度,默认为6 ios_base:precision(n)设置精度 *对于默认的float输出,精度影响所有有效位,对于fixed精度将影响小数位,对于科学表示法scientific,精度影响底数小数位。 *当默认表达形式整数位大于精度范围,或第一个非零数位于小数点后精度位以上,使用科学表示法。 五、设置输出流的宽度 1)使用ios_base的成员函数width() width()获取输出流的输出宽度,当不能完整表示整数或带小数位的实数,则至少扩展到合理表达的宽度,包含有效的精度位,默认情况下返回0,即没有限制宽度。 width(n)设置输出流的输出宽度,仅影响下一次的输出。例如,我们准备输出32bit的十六进制数,包含0x前缀,总共需要10个位数的输出,使用ios_base:width(10)来设置输出宽度,并设置空缺位的填充字符为0,使用basic_ios:fill(0),为输出流传递操纵符internal按内部对齐方式将使基数修饰前缀和数值分别对齐到限制宽度区域的两侧,中间使用0字符填充。 2)使用操纵符setw(n) 类似的操纵符还有控制浮点输出精度的setprecision(n)。 六、操纵符manipulator 1)操纵符的实现 重载流的operator运算符,使之接受特定类型的非成员/静态成员函数,并代为访问该函数,称为流的操纵符。函数将实现为使用流的引用来访问流的成员函数和数据。以下是一个可用于操纵符的函数: inlineios_base&_cdeclright(ios_base&_Iosbase) /setrightinadjustfield _Iosbase.setf(ios_base:right,ios_base:adjustfield); return(_Iosbase); 2)带参数的操纵符 普通的操纵符仅仅接受函数指针来实现operator中的访问权转发。为了使获得转发的访问权的函数可能传递特定的参数,仅仅传递函数指针是行不通的,必须实现一类操纵符专用的类型模板以持有函数指针和参数,接受一个参数的操纵符函数将实例化一个携带函数指针和参数的对象,并重载使用该对象的operator运算符。 一个带参数的操纵符: _Smanip_cdeclsetw(streamsizewide) /manipulatortosetwidth return(_Smanip(&swfun,wide); 为该操纵符重载流的输入输出运算符: templateinline basic_istream&_cdecloperator( basic_istream&_Istr,const_Smanip&_Manip) /extractbycallingfunctionwithinputstreamandargument (*_Manip._Pfun)(_Istr,_Manip._Manarg); return(_Istr); 3)标准库中涉及一个参数的操纵符 resetiosflags(f)清除指定格式标志位 setiosflags(f)设置指定格式标志位 setbase(n)设置整数的基数 setfill设置填充字符 setprecision(n)设置精度 setw(n)设置宽度 第四节、文件流和字符串流 一、流的层次结构简图 1)iostream是同时具有读写能力的流,分别通过访问写缓冲区和读缓冲区完成 2)is_open()检查文件流是否已打开 3)ios_base:ate和ios_base:app文件流打开标志的区别 ate仅在第一次读入时位于文件尾。 app总是向尾部追加数据。 附带_Nocreate避免每次打开时均重新创建,并要求指定文件已打开。 二、使用全局计数器以确认当前初始化状态,对于需要确认其创建优先顺序的对象构造使用计数 三、字符串流stringstream stringstream不依赖于文件和输入输出,以附加的string作为基点操作文本流,或者返回string类型。 iostream是stringstream的基类,提供了丰富的格式控制、进制控制、浮点控制等操作,这些操作的实现是基于流技术的。通过字符串流附加字符串,执行一系列操作后再返回字符串,可以更灵活地,且相对C风格的字符串缓存操作更安全地实现字符格式化处

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论